我正在创建一个网站,但是为了进一步提高我的编码技能,我正在尝试利用 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)
从架构的角度来看,这没有多大意义。因为使用 OO 继承不仅仅是在代码中扩展一个类,而且还以一种有意义的方式设计和构建您的类层次结构。
从逻辑结构标记点来看,我不会想象从验证类继承的登录类。相反,我可能有一个验证类对象作为 Login 类的成员,并使用它的函数来执行验证。
从继承的角度永远记住,我们应该努力让类代表“对象”而不是“动作”。当然,我们可以有登录和验证动作的类,但动作很少以父子方式继承。他们相得益彰,成为班级成员。
调用父类,无论是构造函数还是标准方法都不是强制性的。如果您在父级中指定了部分操作,并且将在子级中定义更细粒度的操作,则这是必需的。
经验法则是,当您向上遍历继承的类链时,它会变得越来越通用,而向下遍历时,它会变得越来越专业化。
不需要调用父构造函数
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()
更容易。但类继承者正常工作并不是绝对需要的,它们在类层次结构中调用构造函数。当然,除非类父级之一需要进行某些特定的初始化才能让后继者正常工作。