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

时间:2015-01-16 18:45:25

标签: php namespaces

我在从不同的命名空间类中的命名空间类调用函数时遇到了一些麻烦。在下面的虚拟示例中,我想知道如何在Class1中使用Class2。我收到了错误:

  

在class1.php中找不到特征'name1 \ name2 \ Class2'

代码:

#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!";
        }
    }
}

感谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

在您的第一堂课中,您的特质是将{2}称为use name2\Class2,但您仍然在name1{}命名空间内,因此实际上您将其称为:use name1\name2\Class2

所以,你需要改变

use name2\Class2;use \name2\Class2

试试这个。

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!";
        }
    }
}

另外,另一个提示:如果要在单独的文件中分离类,则不需要像完成它们那样将它们分开。只需将命名空间简单地称为:

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

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

答案 1 :(得分:1)

好的,所以你已经修复了几个错误。 这是您需要的工作代码:

# 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!";
    }
}

一些解释:

  • 在课堂定义中,use用于traits而不是namespace
  • 在PHP namespace中不需要用大括号括起来
  • 在PHP中,您包含的文件包含includeinclude_oncerequirerequire_once,而不是import

答案 2 :(得分:1)

为什么不放弃静态方法而只是注入类?看起来像是为了这么简单的事情而进行额外的工作。那是什么函数参数。

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!