PHP学习笔记-2(类与对象)

来源:互联网 发布:反美颜软件ios 编辑:程序博客网 时间:2024/06/05 07:07

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 ";    }}//继承关键字 extendsclass Son extends Father{    function __construct()    {//因为父子类的构造函数 同名,实际上是覆盖了父类的构造方法        //parent::__construct();        echo "Son is Creating ";    }}$s = new Son()   //输出的  是 Son is Creating//看了网上一些博客,我自己的理解是://PHP创建子类时,创建一个父类对象。//当子类覆盖了构造函数时,调用子类构造函数,系统对父类数据初始化(并不通过构造函数)//当子类没有构造函数时候,调用父类的构造函数。
0 0
原创粉丝点击