Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 实例化类并从不同的类访问方法_Php_Oop_Class - Fatal编程技术网

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

Php 实例化类并从不同的类访问方法,php,oop,class,Php,Oop,Class,我试图在一个类a的函数中使用一个类B函数。但是,B类的很多函数都包含$this,这会导致问题。这两个类(当然每个类都在自己的文件中): 当我运行类A文件时,我得到(…)中未定义的方法类A::person()的调用,因为我认为在实例化类A时,$this值会改变。它否决了类_B值。我怎样才能阻止这一切 还有一个问题:如何从类A中的每个函数访问类B?我不想重新申报班级。我是否需要这样做: class Class_A { function function1() { requir

我试图在一个类a的函数中使用一个类B函数。但是,B类的很多函数都包含
$this
,这会导致问题。这两个类(当然每个类都在自己的文件中):

当我运行类A文件时,我得到(…)中未定义的方法类A::person()的
调用,因为我认为在实例化类A时,$this值会改变。它否决了类_B值。我怎样才能阻止这一切

还有一个问题:如何从类A中的每个函数访问类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
   }
}

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

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


根据经验,将所有
include
s和
require
s放在脚本顶部。更好的是,设置一个类自动加载程序,并将其注册到
auto\u prepend
脚本中。这样,您就不必手动包含任何内容(至少不必为类定义包含任何内容)。

您可能需要的是依赖项注入,即将
类B
的对象传递到
类A
的构造函数中,并将其作为属性保存在
类A
中。然后,它在
Class_A
中作为
$this->Class b
或类似文件提供

// 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);
通过
Class_B::person()
可以静态调用该方法。因此,您应该将
person()
方法声明为静态,并且不能使用
$this
,因为您没有
类B
的实例

如果您需要
Class_B
的实例,只需创建它并存储在构建时的
Class_B
中即可

class Class_A {
  private $b;
  function __construct()
  {
    $this->b = new Class_B();
  }     
  function stuff()
  {
    $this->b->person();
  }

是关于自动加载类的文档。这非常有效。我试图编辑你的帖子以添加最终的
}
,但它不允许我!
class Class_A {
  private $b;
  function __construct()
  {
    $this->b = new Class_B();
  }     
  function stuff()
  {
    $this->b->person();
  }