Alberto Garrido
Alberto Garrido

Reputation: 555

Call function from different class and namespace

I'm having some trouble to call a function from a namespaced class in a different namespaced class. In the dummy example below I would like to know how to use Class2 within Class1. I'm getting the error:

Trait 'name1\name2\Class2' not found in class1.php

The code:

#file index.php

require "class1.php";
require "class2.php";
$class1 = new name1\Class1();
$class1->sayHello();

#file class1.php

namespace name1{
    class Class1{
        use name2\Class2;
        public function sayHello(){
            echo Class2::staticFunction();
        }
    }
}

#file class2.php

namespace name2{
    class Class2{
        public static function staticFunction(){
            return "hello!";
        }
    }
}

Thank you for any advice.

Upvotes: 4

Views: 5291

Answers (3)

Tek
Tek

Reputation: 3050

Why not drop the static method and just inject the class? Seems like going through extra work for something so simple. That's what function arguments are made for.

namespace name1{
  use \name2\Class2;
    class Class1{
        public function sayHello($Class2){
            echo $Class2->someFunction();
        }
    }
}

namespace name2{
    class Class2{
        public function someFunction(){
            return "hello!";
        }
    }
}

#index.php
include "class1.php";
include "class2.php";
$Class1 = new name1\Class1();
$Class2 = new name2\Class2();
$Class1->sayHello($Class2);
//hello!

Upvotes: 1

mrun
mrun

Reputation: 744

Ok, so you've got several errors which I have fixed. Here's the working code you need:

# index.php
include "class1.php";
include "class2.php";
$class1 = new name1\Class1();
$class1->sayHello();

# class1.php
namespace name1;
use name2\Class2;
class Class1{
    public function sayHello(){
        echo Class2::staticFunction();
    }
}

# class2.php
namespace name2;
class Class2{
    public static function staticFunction(){
        return "hello!";
    }
}

Some explanations:

  • When in class definition the use is used for using traits and not namespace
  • In PHP namespace need not be enclosed in curly brackets
  • In PHP you include files with include, include_once, require, or require_once, and not import

Upvotes: 2

samayo
samayo

Reputation: 16495

Inside your first class, your trait is calling class2 as use name2\Class2 but, you are still within the name1{} namespace, so in reality you are calling it as: use name1\name2\Class2

So, you need to change

use name2\Class2; to use \name2\Class2

Try this.

namespace name1{
  use \name2\Class2;
    class Class1{
        public function sayHello(){
            echo Class2::staticFunction();
        }
    }
}

#file class2.php

namespace name2{
    class Class2{
        public static staticFunction(){
            return "hello!";
        }
    }
}

Also, another tip: If you are separating your classes in separate files, you do not need to separate them as in they way you have done. Just call the namespace simple as:

// file1.php
namespace person; 
class name{}

//file2.php 
namespace address; 
class name{}

Upvotes: 1

Related Questions