从不同的类和命名空间调用函数

问题描述:

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 ame2\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.

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

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 ame2\Class2

So, you need to change

use name2\Class2; to use ame2\Class2

Try this.

namespace name1{
  use 
ame2\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{}

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 
ame2\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!