PHP面向对象-多态,方法修饰符与接口

面向对象

面向对象的三大特性:封装、继承、多态

多态

多态也就是多种形态,分为方法重写和方法重载.但是PHP不允许方法重载
原因有下:

函数的重载需要满足下面两个条件
1、参数的个数不同——而php支持参数缺省,无法用参数个数区别
2、参数的类型不同——而php是弱类型语言,会根据上下文自动做类型转换

方法重写(override)

方法重写:子类重写了父类的同名的方法
有下面三个规则:

  1. 子类的方法名必须和父类的方法名一致

  2. 子类重写的方法的参数个数可以和父类的不一致,仍然可以执行,但会弹出E_STRICT严格模式的警告

Declaration of Son::show(name,age) should be compatible with Father::show()

<?php
class Father{

    public function show(){
        echo 'this is father</br>';
    }
}
class Son extends Father{

    public function show($name,$age){
        echo 'this is Son';
    }
}
?>

3.子类重写的方法的访问权限不能比父类的更加严格,也不能变为static

<?php
class Father{

    public function show(){
        echo 'this is father</br>';
    }
}
class Son extends Father{
 //      重写为protected,错误
    protected function show(){
        echo 'this is Son';
    }
}
?>

报错提示:

Fatal error: Access level to Son::show() must be public (as in class Father)

成员修饰符

static(静态的)

static的用法与C++一样,修饰的成员是属于类的,而不是属于对象,因此共存族类间,所有族类都可以调用

静态属性

静态属性不能通过一个类已实例化的对象来访问
静态属性在加载类的时候分配空间,所以不需要实例化就可以直接访问
静态成员在内存只有就一份,是属于类的

静态方法

类的静态方法不能访问普通成员,只能访问静态成员。因为静态成员被创建的时候可能还没有任何实例被实例化
由于静态方法不需要通过对象即可调用,static声明的方法没有$this指针,所以伪变量 $this 在静态方法中不可用。

self

self表示当前的类
self可以防止类名修改导致多处修改的问题,提升程序健壮性

非静态方法被self::调用,自动转成静态方法(因为方法在类存在时就存在了因此可以从代码区调用,而变量未实例化对象之前是没有的,所以不能用self转为静态属性),但会弹出严格模式的警告(Deprecated: Non-static method Son::show() should not be called statically),可以使用@错误控制运算符屏蔽掉

<?php
class Father{


}
class Son extends Father{

    public function show(){
        echo 'this is Son</br>';
    }
    public static function fun(){
        echo 'this is static</br>';
//@屏蔽就不会报错了
        @self::show();
    }
}

Son::fun();

?>

static静态延时绑定,确定当前对象

可以使用static进行延时绑定,表示使用该成员的对象,而self表示的是self所在的对象

class Person {
    public static $type='人类';
    public function showPerson() {
        //var_dump($this);  //object(Student)#1 (0) { } 
        echo self::$type;   //人类
        echo static::$type; //学生    【静态延时绑定】
    }
}
class Student extends Person {
    public static $type='学生';
    public function showStu() {
        //var_dump($this);  //object(Student)#1 (0) { } 
        echo self::$type;   //学生
        echo static::$type; //学生    【静态延时绑定】
    }
}
//测试
$stu=new Student;
$stu->showPerson();
echo '<hr>';
$stu->showStu();

final

PHP 5 新增了一个 final 关键字
final修饰的类不能被继承
final修饰的方法不能重写

abstract

主要用来修饰方法和类
1、abstruct修饰的方法叫抽象方法,abstruct修饰的类叫抽象类
2、任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
3、被定义为抽象的方法能声明,不能实现。
4、继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制不能比父类的更严格

interface接口

1、如果一个类中所有的方法全都是抽象方法,那么这个类就可以声明成接口,接口是一个特殊的抽象类
3、接口中的抽象方法只能是public的,默认也是public权限
4、通过implements实现接口。实现类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称
5、不能通过final和abstract修饰接口中的抽象方法

//例子来源于PHP中文网
<?php
// 声明一个'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}
// 实现接口
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

继承类与实现接口

继承类与实现接口时,要先继承类再实现接口

class extends Father implements interface{}

类常量

类(接口)中可以放属性、方法、常量
类中的常量使用const定义,可以在类外使用::来访问

<?php
class Father{
const cvar = 9;
}
echo Father::cvar;

?>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容