实例化类和访问来自不同类的方法


Instantiating classes and accessing methods from different classes

我试图在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放在方法中。 included文件中的代码继承了包含它的位置的作用域,在您的示例中,会发生不好的事情。同样,对于类定义脚本,考虑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);