qyl_anikin

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::方法名


php7--面向对象的三大特点 - 眷恋天空的驴 - Web---我要做一个好孩子,从明天起。 多态

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::方法名 调用父类。
//在实现方法覆盖的时候: 访问修饰符可以不一样,但是必须满足子类的访问范围要大于等于父类的
?>


多态在什么地方体现出来?

    --当子类没有覆盖父类的方法,则调用的是父类的方法。如果覆盖则调用自己的方法。

上一篇 下一篇
评论
©qyl_anikin | Powered by LOFTER