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

Call function from different class and namespace

我在从另一个命名空间 class 中的命名空间 class 调用函数时遇到了一些问题。在下面的虚拟示例中,我想知道如何在 Class1 中使用 Class2。我收到错误:

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

代码:

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

感谢您的任何建议。

在你的第一个 class 中,你的特征调用 class2 作为 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!";
        }
    }
}

此外,还有另一个提示:如果您将 classes 分隔在单独的文件中,则不需要像以前那样分隔它们。只需将名称空间简单地称为:

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

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

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

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

一些解释:

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

为什么不删除静态方法而只注入 class?似乎要为如此简单的事情做额外的工作。这就是函数参数的用途。

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!