- 声明:
class classname{
function __construct($para)
{
/*code block*/
}
function __destruct()
{
/*code block*/
}
}
- 实例化 new
- 伪变量$this 和 self(两者基本一致,后者主要访问静态变量和常量)
- 调用方法及属性符号: ->
- 构造函数 __construct()
- 析构函数 __destruct()
- 方法重写 # 类里面支持函数的重载,别的地方不支持
- 属性或者方法的访问控制 public, protected, private (默认公有) # protected的子类能继承,private则不能继承。
- 继承 extends
- final关键字 父类中的方法被声明为final,则无法覆盖该方法; 若一个类被声明为final则无法继承
- php不支持多重继承 # 可以用接口实现近似的作用
- 接口(用于指定某个类必须实现哪些方法):接口中所有方法为空,且必须为公有; 关键字inteface; 引用时implements
interface Test{ # 定义接口
function test_1()
}
class Test_sub implements Test{ # 继承和实现接口
function test_1(){
/*code block*/
}
}
- 引用接口的类必须实现接口中所定义的方法,类可以实现多个接口,中间用逗号来分隔;类的继承要在接口实现关键字之前:
class C_sub extends C_par implements I_1, I_2, I_3 # 继承一个类,实现3个接口
interface I_3 extends I_1, I_2 # 接口不能实现另一个接口,能继承多个
- trait # 推荐用于实现多重继承功能的方式
trait t_test{ # 特性定义
public function ft_test($param){
/* code block */
}
}
class C_test{
use t_test; # 使用特性
function fc_test($param){
$this->logmessage($msg);
}
}
- trait中定义的方法会重载父类中的方法,而子类中的方法会重载trait中的方法
- 两个trait中的同名方法可以同时调用
class C_test{
use t1, t2{
t1::f_test insteadof t2 # 用t1中的f_test方法代替t2中的f_test方法
t2::f_test as private ft2_test # 给t2中的f_test设置别名ft2_test
}
function fc_test($param){
$this->f_test() # t1中的f_test()方法
$this->fc_test() # t2中的f_test()方法
}
}
- 抽象类 # 抽象类必须要有一个方法是抽象的, 包含有抽象方法的类也必须是抽象类,抽象类不能被实例化; 和接口的异同; 抽象类强制继承方法关键字abstract
abstract class C{ # 抽象类
abstract function f_name_1($para); # 抽象方法
function f_name_2($para){
/* code block */ # 普通方法
}
}
-
const关键字; 访问$class::constant_name; constant函数,返回一个常量的值
-
用变量来动态调用类 如$cls = new Class_name(); $cls = “Class_name” =====> 常量获取 $cls::constant_name
-
PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
-
static关键字 静态方法或属性 静态属性和常量的区别(静态属性定义在内存中,一个可修改一个不可修改)
-
parent::__construct(); 调用父类的构造方法
-
__get(KaTeX parse error: Expected group after '_' at position 8: key) 和 _̲_set(key, $value) # 和python中魔法方法设置相同,前者访问属性,后者设置属性值
-
instanceof: # $b instanceof B 可以判断类,接口,不适用trait
-
静态绑定:用static::whichclass()替代self::whichclass()时,将执行当前类的调用方法(避免继承时调用的是父类方法)
<?php
class A {
public static function whichclass() {
echo __CLASS__;
}
public static function test() {
self::whichclass();
}
}
class B extends A {
public static function whichclass() {
echo __CLASS__;
}
}
A::test(); # 打印A
B::test(); # 打印A 若要打印B则用上述方法
?>
- 克隆类:$c = clone $b # clone时会触发__clone()方法,如同构造析构函数一样,不可以直接访问,但是可以触发
- 重载:动态创建属性和方法,即访问未定义的方法时触发__call()魔法方法,在此方法中定义想执行的操作;在静态上下文中调用不可访问的方法时触发__callStatic()魔法方法
- __autoload(): 7.2弃用现在用spl_autoload_register
- 可以用foreach来遍历类的属性
- 迭代器和生成器
- __toString()魔法方法:方法的return值作为echo实例时展示的值
- var_export()展示所有类属性
- reflection API # 反射类
<?php
require_once("xxx.php");
$class = new ReflectionClass("xxx");
echo "<pre>".$class."</pre>" # 利用反射类查看类信息
?>