在1.1节的代码中定义了两个类,一个是person,一个是family;在family类中创建person类中的对象,把这个对象视为family类的一个属性,并调用它的方法处理问题,这种复用方式叫“组合”。还有一种复用方式,就是继承。
类与类之间有一种父与子的关系,子类继承父类的属性和方法,称为继承。在继承里,子类拥有父类的方法和属性,同时子类也可以有自己的方法和属性。
可以把1.1节的组合用继承实现,如代码清单1-6所示。广州网站建设
代码清单1-6 family_extends.php
- <?php
- class person{
- public $name='Tom';
- public $gender;
- static $money=10000;
- public function construct(){
- echo '这里是父类',PHP_EOL;
- }
- public function say(){
- echo $this->name," \tis ",$this->gender,"\r\n";
- }
- }
- class family extends person{
- public $name;
- public $gender;
- public $age;
- static $money=100000;
- public function construct(){
- parent::construct();// 调用父类构造方法
- echo '这里是子类',PHP_EOL;
- }
- public function say(){
- parent::say();
- echo $this->name," \tis\t",$this->gender,",and
- is\t",$this->age,PHP_EOL;
- }
- public function cry(){
- echo parent::$money,PHP_EOL;
- echo '%>_<%',PHP_EOL;
- echo self::$money,PHP_EOL;// 调用自身构造方法
- echo '(*^^*)';
- }
- }
- $poor=new family();
- $poor->name='Lee';
- $poor->gender='female';
- $poor->age=25;
- $poor->say();
- $poor->cry();
运行上面的代码,可以得到如下输出结果:
- 这里是父类
- 这里是子类
- Lee is female
- Lee is female,and is 25
- 10000
- %>_<%
- 100000
- (*^^*)
从上面代码中可以了解继承的实现。在继承中,用parent指代父类,用self指代自身。使用“::”运算符(范围解析操作符)调用父类的方法。“::”操作符还用来作为类常量和静态方法的调用,不要把这两种应用混淆。
既然提到静态,就再强调一点,如果声明类成员或方法为static,就可以不实例化类而直接访问,同时也就不能通过一个对象访问其中的静态成员(静态方法除外),也不能用“::”访问一个非静态方法。比如,把上例中的$poor->cry();换成$poor::cry(),按照这个规则,应该是要报错的。可能试验时,并没有报错,而且能够正确输出。这是因为用“::”方式调用一个非静态方法会导致一个E_STRICT级别的错误,而这里的PHP设置默认没有开启这个级别的报错提示。打开PHP安装目录下的php.ini文件,设置如下:
- error_reporting = E_ALL| E_STRICT
- display_errors = On
再次运行,就会看到错误提示。因此,用“::”访问一个非静态方法不符合语法,但PHP仍然能够正确地执行代码,这只是PHP所做的一个“兼容”或者说“让步”。在开发时,设置最严格的报错等级,在部署时可适当调低。



