PHP面向对象

72次阅读
没有评论

共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。

$this self:: parent::

$this 是当前对象的引用,一般出现在方法里,用于获取类的成员属性,或执行类的成员方法。

self:: 是对本类的引用,用于获取当前类的静态成员属性或静态成员方法。

parent:: 是对父类的引用。用于调用父类的方法或属性。

类常量

使用 const 来定义类常量,使用 self:: 来调用类常量。

<?php
class A {
    const YES = 1;
    public function aa() {return self::YES;}
}
echo (new A)->aa(); //1

方法重写

子类可以重写父类的方法,但使用 final 声明的方法,将禁止在子类中重写父类方法。

抽象类

具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承。

继承一个抽象类的时候,方法的可见性必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为 protected,那么子类中实现的方法就应该声明为 protected 或者 public,而不能定义 private。

<?php
abstract class A {
    // 强制要求子类定义这些方法
    abstract protected function a1();
    abstract protected function a2($aa);

    // 普通方法(非抽象方法)public function print() {echo '不用强制定义该方法';}
}

class B extends A {protected function a1() {return 'a1 方法被调用';}

    public function a2($aa) {echo " 调用 a1 方法,参数:{$aa},结果:{$this->a1()}";
    }
}

$obj = new B;
$obj->print();
$obj->a2('666');

接口

接口是一种特殊的抽象类,而抽象类又是一种特殊的类,所以可以将接口看作是一种特殊的类。

PHP 只支持单继承,如果想实现多继承,就需要使用接口,通过关键字 interface 来声明接口。

<?php
interface I {
    const NAME = '张三';
    function fun();}

class A implements I {public function fun() {echo self::NAME;}
}
$obj = new A();
$obj->fun(); // 张三 

Trait

PHP 是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,出现了 Trait,为 PHP 单继承而准备的一种代码复用机制。

Trait 和 Class 相似,但无法通过 trait 自身来实例化,在类中使用 use 关键字,声明要组合的 Trait 名称。

<?php
trait A {public function aa() {echo 'aa';}
}
trait B {public function bb() {echo 'bb';}
}
class C {
    use A, B;
    public function cc() {echo 'cc';}
}
$c = new C;
$c->aa(); //aa
$c->bb(); //bb
$c->cc(); //cc

解决冲突

<?php
trait T1 {public function fun() {echo __METHOD__;}
}
trait T2 {public function fun() {echo __METHOD__;}
}

class A {
    use T1, T2 {
        T1::fun insteadof T2;
        T2::fun as fun2;
    }
}
$obj = new A();
$obj->fun(); //T1::fun
$obj->fun2(); //T2::fun

T1::fun insteadof T2; 表示使用 T1::fun 方法替代 T2::fun 方法。

T2::fun as fun2; 将 T2::fun 别名为 T2::fun2。

魔术方法

构造 & 析构方法

构造方法__construct():在创建对象时自动执行,没有返回值,用于执行类的一些初始化工作,如可以在构造方法中传递参数,进行对象属性的初始化。

析构方法__destruct():当所有对象的引用被销毁时执行。

__set() 和__get()

这两个方法不是默认存在的,而是手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在。

__get():这个方法用来获取私有成员属性值,当尝试读取一个不存在或不可访问的属性值时,PHP 会自动调用__get() 方法。

__set():这个方法用来为私有成员属性设置值,当给一个不存在或不可访问的属性赋值时,PHP 会自动调用__set 方法。

__isset() 和__unset()

当使用 isset() 或者 empty() 函数判断属性是否存在或者是否为空的时候会自动触发。

当使用 unset() 函数判断属性时,如果存在__unset() 方法将会执行。

__call() 和__callStatic()

__call() 用来监视一个对象中的其它方法。如果试着调用一个对象中不存在或被权限控制的方法,__call 方法将会被自动调用。

当调用的静态方法不存在或权限不足时,会自动调用__callStatic 方法。

正文完
 0
三毛笔记
版权声明:本站原创文章,由 三毛笔记 于2023-11-15发表,共计2097字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)