混淆了何时在PHP中与子班实例化父母

  • 本文关键字:实例化 父母 PHP 何时 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...
     }
 }

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

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
    }
 }

我的验证_class中我的所有函数(方法)是" public",当我实例化我的孩子课时,我可以使用以下方式调用任何验证类方法:

$className = "Login_Class";
$thisClass = new $className();

呼叫parent constructor

不是不确定的
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
     }
  }
}

很好。但是,如果您想从父母必须做的事情中受益才能正常工作,则可能需要对父母__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);
  }
}

在php" oop"中,这不是您在其他语言中看到的真实的OOP,构造函数只是实例化结果对象的速记。如果我们一遍又一遍地打电话

,那将是一个地狱
$object = new MyClass();
$object->instantiate()

因此,调用__constructnew ClassName()更容易。但是,班级成员在班级结构中称为构造函数并不是绝对需要的。当然,除非在一个班级的父母中需要一定的初始化才能让继任者正常工作。

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

从逻辑结构邮票点我不会想象从验证类继承的登录类。相反,我可能将验证类对象作为登录类的成员,并使用其功能执行验证。

从继承的角度来看,请务必记住,我们应该努力拥有代表"对象"而不是"动作"的类。当然,我们可以有用于登录和验证操作的课程,但是动作很少以亲子方式继承。他们可以更好地补充班级成员。

调用父类,无论是构造函数还是标准方法。如果您要在父母中指定的动作,并且孩子将在孩子中定义更多细粒度的动作。

拇指的规则是,当您穿越继承的阶级链时,它变得越来越通用,并且随着您的穿越,它变得越来越专业。

而不是使用继承,使用策略模式进行验证是一种流行的模式之一。这使代码更加模块化和扩展,

使用策略设计模式验证传入数据

最新更新