1、类
类中有 属性、方法、构造析构函数、静态变量(static)、常量(const)
还有一些特殊的方法
1.1类的定义
//类的定义:
class Test
{
private $a; //private protected public(默认)
const PI = 3.14 //常量,不需要写 "$"
static $b = 5; //静态变量,要写 "$"
function __construct($a) //构造函数,不支持重载
{
$this->$a; //方法内部可以用$this,这里 $a 的 $可省略,
}
function Test(){} //php4的构造函数,兼容,但优先选择__construct(),没有时才找Name();
function __destruct(){} //析构函数,释放自己分配的资源
}
$obj = new Test();
$obj->newProperty ="" //对象的属性可动态扩展(类python)
Test::PI;
Test::$b;
1.2 类的特殊关键字、符号、函数:
$this //在类方法内部,代表对象本身
self //在类内部,代表 类本身,而不是对象本身。常用于访问 静态变量, self::var;
:: //作用域符,用于访问 类常量、静态变量
-> //对象访问属性、调用方法
parent //指向父类的引用
=== //对象引用是否相等
== //对象 的属性值相等,且是同一个类的实例,则返回true
1.3 类方法的覆盖和重载
//php中不支持直接重载,但可用call间接实现重载
//php中创建对象时,若子类有自己构造函数,则不会隐式调用父类的构造函数(自己parent::__construct()调用)
//若没有,则继承一个父类的构造函数并调用(调用父类的构造函数)。
//
1.4类的魔术方法 (特殊方法):
__construct() //构造函数
__destruct() //当销毁一个对象被调用。
__set() //__set($name, $value) 对私有属性赋值时,会调用
__get() //__get($name) 取私有属性 值时调用
__call() //__call($name,$args);对象调用某个方法,若存在直接调用。不存在时调用
__callStatic()
__toString() //对象被当做string用时调用。PHP5.2 之前只有在直接使用于 echo 或 print 时才能生效。PHP 5.2.0 之后,则可以在任何字符串环境生效
__clone() //__clone(),克隆对象时被调用。如:$t=new Test();$t1= $t;
__invoke() //把对象当做函数调用时,自动调用invoke([args...])
__autoload() //__autoload($classname).实例化一个对象时,如果对应的类不存在,则该方法被调用。通常在方法中 require_once($classname),导入文件
__isset() //php中有一个isset($name)方法,检测是否已经定义变量(不是Null),当对私有属性 调用 isset()时,会调用__isset($obj->$name)
__unset() //unset一个对象的属性时被调用。如:unset($obj->name)。
__sleep() //用于序列化。serialize() 函数会检查类中是否有 __sleep()。如果有,会先调用,然后才执行序列化操作
__wakeup() //与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法
static __set_state() //5.1.0 起当调用 var_export() 导出类时调用.var_export($var)是返回
1.4 抽象类和抽象方法
//抽象类不能实例化
//包含抽象方法的类一定是 抽象类
//抽象类不一定 有 抽象方法
abstract class ABC
{
abstract function F();
}
1.5 类的继承
//非常重要:子类中若没有覆盖父类的,则访问的都是父类的,若子类中覆盖了父类的,则访问的是子类的,必须parent::才能显示访问父类被覆盖的内容。
//另: 覆盖不能是 更 严格 访问权限
class Father
{
function __construct()
{
echo "Father is Creating ";
}
}
//继承关键字 extends
class Son extends Father
{
function __construct()
{//因为父子类的构造函数 同名,实际上是覆盖了父类的构造方法
//parent::__construct();
echo "Son is Creating ";
}
}
$s = new Son() //输出的 是 Son is Creating
//看了网上一些博客,我自己的理解是:
//PHP创建子类时,创建一个父类对象。
//当子类覆盖了构造函数时,调用子类构造函数,系统对父类数据初始化(并不通过构造函数)
//当子类没有构造函数时候,调用父类的构造函数。