【问题标题】:PHP Variable Subclass and Accessing Parent MethodsPHP 变量子类和访问父方法
【发布时间】:2020-02-13 19:21:17
【问题描述】:

这似乎是一个糟糕的设计模型,但无论如何我都会问。 我想从可变选择的子类中访问父方法。 在此示例中,找不到 $db。

class car {
    function __construct(){
        $db = doSomethingGetDBObj();
        global $db; $this->db = $db;
    }
}

class engine extends car {

    var $valve;
    function whichValve( $which ){
        $this->valve = new $which();
        var_dump( $this->valve->motion() );
    }
}

class valve1 extends engine {
    function motion(){
        return( parent::$db->GetRow("query for valve 1") );
    }
}

class valve2 extends engine {   
    function motion(){
        return( parent::$db->GetRow("query for valve 2") );
    }
}

$drive = new engine();
$drive->whichValve( "valve2" );

【问题讨论】:

    标签: php oop scope


    【解决方案1】:

    parent 关键字用于在存在本地覆盖的方法时访问父方法。您可以使用$this->db 访问 db 属性,即使它是在父类中创建的。

    【讨论】:

      【解决方案2】:

      首先,您不应该访问超全局变量来获取 DB 对象。相反,传入构造函数。

      我在类中添加了protected$db 属性,这意味着它不能在类外访问(但后代可以访问)。

      然后,在子类中,您可以使用$this->db 访问$db 属性,因为该类是car 的后代。

      其他一些小建议:

      • 我建议类名的第一个字母大写
      • return 语句不需要括号
      • 不要将类名传递给whichValve,而是传递一个构造对象(这样调试代码要容易得多)
      class car {
          protected $db;
      
          function __construct($db){
              $this->db = $db;
          }
      }
      
      class engine extends car {
          protected $valve;
      
          function whichValve( $which ){
              $this->valve = new $which();
              var_dump( $this->valve->motion() );
          }
      }
      
      class valve1 extends engine {
          function motion(){
              return $this->db->GetRow("query for valve 1");
          }
      }
      
      class valve2 extends engine {   
          function motion(){
              return $this->db->GetRow("query for valve 2");
          }
      }
      

      【讨论】:

      • 整个想法来自 WordPress 如何处理插件。我想尝试使用所有通用方法(getConfiguration、setConfiguration 等)的可安装扩展(用于自定义应用程序)。在我的示例中,阀门是插件。但是阅读您的解释,我似乎还有更多工作要做,首先要了解范围和保护。感谢您花时间为我记录这些内容。这是一个很棒的速成课程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2012-07-04
      • 2011-09-21
      • 2023-04-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多