我正在尝试在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
}
}
或者我是否需要使用构造函数?
答案 0 :(得分:2)
按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();
}
答案 1 :(得分:1)
不要将require
放在方法中。 include
d文件中的代码会继承您包含它的地方的范围,在您的示例中,会发生不好的事情。此外,对于类定义脚本,请考虑require_once
而不是require
,以避免多个定义。
根据经验,将所有include
和require
放在脚本的顶部。更好的是,设置一个类自动加载器,并在auto_prepend
脚本中注册它。这样,您就不必手动包含任何内容(至少不包括类定义)。
答案 2 :(得分:0)
您可能需要的是依赖注入,您可以将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);