PHP面向对象中的相互调用的问题
很多人对面向对象的理解,只停留在将某一功能代码封装到某一个类中。这样的做法,结果是,留给使用者调用。但仅仅是这样做。很多程序使用面向对象就无法实现。原因相当简单。因为,某些代码一旦写出来,这个代码不是让别人调用你的函数。而是你要去调用别人的类,别人的函数代码。
为什么会有这种情况,主要是面向抽象编程时。很多具体的代码,只有在针对具体问题实现时,才能写出来。
打个比方:
比如你写一个模板引擎。其中有很多语言标记。你的解析器则需要对所有标记进行解析。但这些标记如果一开始就写全了,那就不可能有扩展性了。
这时,就需要有一种约定,将标记解析器定义为一个抽象的类,或一个接口,让写具体代码的人去按此约定进行实现。
这里,我们发现,这不是简单的让别人调用。而是写一个调用别人的代码的程序。
可见,你调我的,简单。只要你明白我有哪些类,哪些函数。而我调你的,则我要告诉你,你的类要怎样写,其中要有哪些函数。
使用这样的方法,不仅是易于大应用的功能模块划分,清析的架构,同时,也是降低模块之间的耦合度。
PHP提供了各种途径来帮助我们实现程序中的“我调你”,这包括:
抽象函数:必须要由你实现的函数,我将其定义为抽象函数。格式是:
abstract public function funcName($param /.../ ){};
抽象函数中无实现的代码。因为实现的代码是要你实现的。
如果一个类中有抽象函数,那么,此类就是抽象类,不能被实例化成对象。
但如果,一个类中所有方法全是抽象的,则,我们就不必再定义为抽象类了。我们完全可以使用接口。
接口定义与类定义相同,只是把class关键字换成interface就行了。
可见,我给你留下了这些可以填空的空白。填与不填,由你决定。这也就是给你提供了另一方式的“调用”。
如果你要用此抽象类,你只要继承此类,生成一个具体的类即可。
同样,如果你要用此接口,你也只要写一个类,实现此接口即可以了。
有时,我的类是单件模式的,那么,就要在类中加一个保护,保证它永远在此模式下运行。这个保护方式是加一个函数:
final private function __clone() {}
函数中无实现代码,是阻止类的复制。这样就保证永远只有一个了。
由此我们看到了,这里有一个final,final是对函数,对方法实现最终保护。所谓最终保护,就是说它是终点,不会再生出下一代了。
对函数而言,子类中不会再生成同名函数,对于类,此类再也不可被继承。
所以,如果某个类不能再被继承,则定义时,前面加一个final。某个方法,包括构造函数,可以在定义前面加上final关键字。
为什么要这样呢?这样做的目的是为了简单,我可以少写很多代码,同时,你也会在约定的模式之下。保证代码强壮性与安全性。
页:
[1]