我试图在Class_A的函数之一中使用Class_B函数。但是很多Class_B的函数都包含$this
,这会导致问题。这两个都是类(当然每个类都在自己的文件中):
class Class_A
{
function hello()
{
require('class_b.php');
echo 'Hello ' . Class_B::person();
}
function bye()
{
require('class_b.php');
echo 'Bye ' . Class_B::person();
}
}
class Class_B
{
function person()
{
// various operations and variables
echo $this->get_user($id);
}
}
当我运行Class_A文件时,我得到Call to undefined method Class_A::person() in (...)
,因为我认为当我实例化Class_A类时,$this值发生了变化。它会重写Class_B值。我怎样才能阻止这一切?
另外,另一个问题:我如何从Class_A中的每个函数访问Class_B ?我不想重新声明这个类。我需要这样做吗:
class Class_A
{
function function1()
{
require('class_b.php');
$class_b = new Class_B();
// code
}
function function2()
{
require('class_b.php');
$class_b = new Class_B();
// code
}
}
或者我需要使用构造函数之类的吗?
通过Class_B::person()
,您静态地调用该方法。因此,您应该将person()
方法声明为静态方法,并且不能使用$this
,因为您没有Class_B
的实例。
如果您需要Class_B
的实例,只需创建它并在构建时存储在class_B
中。
class Class_A {
private $b;
function __construct()
{
$this->b = new Class_B();
}
function stuff()
{
$this->b->person();
}
不要将require
放在方法中。 include
d文件中的代码继承了包含它的位置的作用域,在您的示例中,会发生不好的事情。同样,对于类定义脚本,考虑require_once
而不是require
,以避免多个定义。
根据经验,将所有include
s和require
s放在脚本的顶部。更好的方法是,设置一个类自动加载器,并将其注册到auto_prepend
脚本中。这样,您就不必手动包含任何内容(至少对于类定义而言)。
您可能需要的是依赖注入,即将Class_B
的对象传递给Class_A
的构造函数,并将其作为Class_A
的属性保存。然后在Class_A
中以$this->classB
或类似的形式可用。
// Include Class_B code outside the class.
require_once('class_b.php');
class Class_A {
// Property to hold Class_B
public $b;
// Constructor
public function __construct($b) {
$this->b = $b;
}
public function function1(){
// code
$this->b;
}
public function function2(){
// code
$this->b;
}
}
// Now call your objects:
// The Class_B which will be injected into A
$b = new Class_B();
// Your Class_A, which holds an instance of Class_B as a property
$a = new A($b);