lichaoyue888 发表于 2017-4-10 11:55:06

PHP面向对象中的相互调用的问题

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