【问题标题】:How to structure PHP classes [closed]如何构造 PHP 类 [关闭]
【发布时间】:2020-05-03 11:09:39
【问题描述】:

在文件 A 中,

Class A {
   __construct() {
          ...
      lots of code 
          ...
  }

  public function P() {
      code here
  }
}
New A();

在文件 B 中,

Class B {
   __construct() {
          ...
      lots of code 
          ...
  }

  public function E() {
      I need to call function P in Class A
  }
}
New B();

我想在函数E()中调用函数P()

有没有办法调用另一个类中的函数?

我找到了几种方法,例如使用 __construct( A $aobj ) 或“扩展”的依赖注入

但是,class A 已经在文件 A 中实例化了,__counstruct 中有很多东西所以我想知道

1) 耐火技术途径

2) 在函数 P() 中调用函数 E() 的奇特方式。

【问题讨论】:

    标签: php class oop


    【解决方案1】:

    这真的取决于 B 类与 A 的关系:

    • 无链接:A中的函数应该是静态的(它不与A的特定实例及其属性交互),您可以调用A::P()

    • 类 B 是 A 的子类:

    在 B 类定义中,你有一个 class B extends A,在 B 的构造函数中,你将有一个 parent::__construct() 来调用 A 的构造函数。 然后你可以简单地调用 $this->P() :因为 B 是 A 的子类,而 P 是公共的(或受保护的),B 继承了 A 的所有方法

    • B 类使用 A 类型的对象`

    那么,你必须在B类中有一个$a属性,在B的构造函数中有一个$this->a = new A();。你可以用$this->a->P();调用P

    或者如果你只需要在E()中临时需要A,你可以构造一个新对象$a = new A();并在E的代码中调用$a->P();

    【讨论】:

    • 感谢您的详细解释!! :) 它有很大帮助!我可以问你一个问题吗?在“无链接”的情况下,为什么它应该是“静态的”?
    • 因此您可以调用该函数而不必实例化一个对象,这可能会占用大量资源(在您的示例中似乎就是这种情况)。如果您不必操作特定对象的内部状态,静态方法可以让您在不经过构造函数的情况下获得结果。
    • 感谢您的回复!!我真的很感激 :) 为了实例化类 A 的性能,我从 A 的 __construct 中移走了大部分动作,并使用了最后一种方法,因为函数 P 需要一些 __construct 项。因此,我无法使用静态函数 P。谢谢你,我从你那里学到了很多东西:)
    【解决方案2】:

    假设我们有一个包含类 A 的文件 a.php:

    class A {
    
      public function __construct()
      {
    
      }
    
      public function P()
      {
        echo "It is function P";
      }
    }
    

    而包含B类的文件b.php,在文件b.php中我们首先包含a.php

    include('a.php');
    class B {
    
      private $aobj;
    
      public function __construct(){
        $this->aobj = new A();
      }
    
      public function E(){
        $this->aobj->P();
      }
    }
    
    $b = new B();
    $b->E();
    

    现在打开浏览器和http://localhost/your-project/b.php 看看结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多