【问题标题】:Instantiating classes and accessing methods from different classes实例化类和访问来自不同类的方法
【发布时间】:2012-03-31 06:21:46
【问题描述】:

我正在尝试在 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 (...),因为我认为 $this 值在我实例化 Class_A 类时已更改。它会否决 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
   }
}

或者我需要使用构造函数还是什么?

【问题讨论】:

    标签: php oop class


    【解决方案1】:

    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();
      }
    

    【讨论】:

    • 这很好用。我试图编辑你的帖子以添加最后的},但它没有让我!
    【解决方案2】:

    不要将require 放在方法中。 included 文件中的代码继承了包含它的位置的范围,在您的示例中,发生了不好的事情。此外,对于类定义脚本,请考虑使用require_once 而不是require,以避免多个定义。

    根据经验,将所有includes 和requires 放在脚本的顶部。更好的是,设置一个类自动加载器,并在auto_prepend 脚本中注册它。这样一来,您就不必手动包含任何内容(至少对于类定义而言)。

    【讨论】:

    • Here 是关于自动加载类的文档。
    【解决方案3】:

    您可能想要的是依赖注入,即您将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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 2021-06-03
      • 1970-01-01
      • 2012-12-07
      • 2015-07-09
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多