php7--面向对象的三大特点
1. 在php中直接继承是单一继承。但是可以通过继承了多次达到目的
<?php
//php一个类只能继承一个父类,指的是直接继承。
header('content-type:text/html; charset="utf-8" ');
error_reporting(0);
class A{
public $n='php100';
}
class B extends A{
public $a = '23';
}
class C extends B{
}
$c1 = new C();
echo $c1->n.'<br/>'; //100
echo $c1->a; //23
?>
2. 和java不一样,子类默认情况下是不会继承父类的构造方法。
<?php
header('content-type:text/html; charset:"utf-8"' );
error_reporting(0);
// 和java不一样,子类默认情况下是不会继承父类的构造方法。
class A{
public $name = 'anikin';
public function __construct(){
//$this->n =$n;
echo'AA类的构造方法';
}
}
class B extends A{
public function __construct(){
echo 'B类的构造方法';
A::__construct(); //显式的调用父类的方法 回调初始化父类,了解即可。
parent::__construct();
}
}
$B1 = new B();
?>
3. 在子类中如果想调用父类的方法包括构造方法,前提是public和protected. 可以使用 类名::方法名 或者 parent::方法名
多态
4. 子类的方法和父类的方法完全一样,称之为方法的覆盖(override)或者方法的重写。
overload方法重载:函数名一样,通过函数的参数个数或者参数的类型不同,达到调用同一个函数名,但是可以区分函数PHP对重载的支持是通过魔术函数实现的,区别于其他语言。php5是如何通过魔术方法实现魔术重载:__call()
魔术常量:
<?php
header(' content-type:text/html; charset="utf-8" ' );
error_reporting(0);
class A{
function test1($n){
echo'接受一个参数';
}
function test2(){
echo '接受两个参数<br/>';
// echo '输出类名是'.__CLASS__.'<br/>';
// echo '输出函数的名称是'.__FUNCTION__;
}
function __call($method,$p){
var_dump($p);
//如果调用一个方法如果不存,则会自动掉用__call();
if( $method == "test"){
//用参数的个数区分,也可以用参数的类型或者其他进行区分
if( count($p) == 1 ){
$this->test1($n);
}else if( count($p) == 2 ){
$this->test2();
}
}
}
}
$A1 = new A();
$A1->test(121); echo'<br/>';
$A1-> test(12,23.0);echo'<br/>';
echo __LINE__; echo'<br/>';//行数
echo __FILE__; echo'<br/>';
echo __DIR__; echo'<br/>';
echo __CLASS__; echo'<br/>'; //当前在哪个类里面
echo __NAMESPACE__;
?>
方法重写:要求子类的方法名和参数,但是并不要求参数的名称一样。也可以使用上一节的 类名::方法名 或者 parent::方法名 调用父类。
在实现方法覆盖的时候: 访问修饰符可以不一样,但是必须满足子类的访问范围要大于等于父类的。
<?php
header(' content-type:text/html; charset="utf-8"');
error_reporting(0);
class Animal{
public $name;
function jiao(){
echo '不知道怎么叫';
}
}
class Pig extends Animal{
function jiao(){
echo '这是覆盖的猪的叫法';
parent::jiao(); //都输出
}
}
$p1 = new Pig();
$p1->jiao();
//方法重写:要求子类的方法名和参数一样。也可以使用上一节的 类名::方法名 或者 parent::方法名 调用父类。
//在实现方法覆盖的时候: 访问修饰符可以不一样,但是必须满足子类的访问范围要大于等于父类的
?>
多态在什么地方体现出来?
--当子类没有覆盖父类的方法,则调用的是父类的方法。如果覆盖则调用自己的方法。