关于何时在 php 中从子类实例化父类的困惑

Joh*_*n T 4 php oop

我正在创建一个网站,但是为了进一步提高我的编码技能,我正在尝试利用 OOP 的力量来完成它。

我正在使用类来验证表单输入,所以我想我会有一个“父”验证类,然后是每个提交的表单的子类(即登录类、注册类等),它将负责将正确的值放入数据库等

我见过的代码有从孩子的构造函数构造父。但是,我没有这样做,但我的课程似乎仍然有效?

有人可以向我解释为什么我们从孩子那里调用父构造函数吗?另外,我的代码是否只工作是因为我在我的父母中有“公共”功能(方法)?(这可能是一个问题)?

我的代码(为清楚起见的删节版)如下:

class Validation_Class
{
 public function __construct()
{
 // constructor not needed
 }

 public function is_genuine_email_address($email) {
     // code to validate email are genuine here...
     }

 }
Run Code Online (Sandbox Code Playgroud)

我的孩子班看起来像...

class Login_Class extends Validation_Class
{

public function __construct()
{
    // I don't call parent::__construct() from here
    // should I be doing?
    // I can still access parent methods with $this->is_genuine_email_address
    }

 }
Run Code Online (Sandbox Code Playgroud)

我的 Validation_Class 中的所有函数(方法)都是“public”的,当我实例化我的子类时,我可以使用以下命令调用任何 Validation Class 方法:

$className = "Login_Class";
$thisClass = new $className();
Run Code Online (Sandbox Code Playgroud)

rai*_*ace 5

从架构的角度来看,这没有多大意义。因为使用 OO 继承不仅仅是在代码中扩展一个类,而且还以一种有意义的方式设计和构建您的类层次结构。

从逻辑结构标记点来看,我不会想象从验证类继承的登录类。相反,我可能有一个验证类对象作为 Login 类的成员,并使用它的函数来执行验证。

从继承的角度永远记住,我们应该努力让类代表“对象”而不是“动作”。当然,我们可以有登录和验证动作的类,但动作很少以父子方式继承。他们相得益彰,成为班级成员。

调用父类,无论是构造函数还是标准方法都不是强制性的。如果您在父级中指定了部分操作,并且将在子级中定义更细粒度的操作,则这是必需的。

经验法则是,当您向上遍历继承的类链时,它会变得越来越通用,而向下遍历时,它会变得越来越专业化。


dav*_*rad 5

不需要调用父构造函数

class Parent {
  //maybe just holding some constants
  public $database = 'mydatabase';
}

class Child extends Parent {
   public function myFunction() {
     if ($this->database == 'myDatabase') {
       // you can access the parents data without calling a constructor
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

很好。但是,如果您想从父级必须自己做的事情中受益才能正常工作,则__construct可能需要致电父级 - 例如

class Parent {
  public $database = null;
  public function __construct() {
    // example -> login to database
  }
}

class Child extends Parent {
  public function __construct() {
    parent::__construct();
    // .. further code
  }

  public function myFunction() {
     // do something, like executing a query
     $this->database->executeQuery($SQL);
  }
}
Run Code Online (Sandbox Code Playgroud)

在 PHP“OOP”中,它不像您在其他语言中看到的那样是真正的 OOP,构造函数只是实例化结果对象的简写。如果我们一遍又一遍地打电话,那就太糟糕了

$object = new MyClass();
$object->instantiate()
Run Code Online (Sandbox Code Playgroud)

所以打电话__construct或者new ClassName()更容易。但类继承者正常工作并不是绝对需要的,它们在类层次结构中调用构造函数。当然,除非类父级之一需要进行某些特定的初始化才能让后继者正常工作。