实例化类并从不同的类访问方法

时间:2011-07-08 20:11:41

标签: php oop class

我正在尝试在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
   }
}

或者我是否需要使用构造函数?

3 个答案:

答案 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,以避免多个定义。

根据经验,将所有includerequire放在脚本的顶部。更好的是,设置一个类自动加载器,并在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);