美文网首页
2019-01-14

2019-01-14

作者: 成都阿童木 | 来源:发表于2019-01-16 14:37 被阅读0次

1. 类与对象

    (1)定义类时 类名不能有$。

           class COMPUTER{ }

定义类的属性时,属性时变量,要有$。

           class COMPUTER{

                    public $cpu="intel";

 }

对象使用属性时,直接用属性名,不能有$

        $computer=new COMPUTER();

       echo  ($computer->cpu);

定义函数时 函数名前不能有$

function test(){}

(2)构造方法与析构方法

构造 public function __construct(){}  都是两个下划线

析构public function __destruct(){}  一般在一个类里的最后部分定义。也可以手动关闭对象。使用unset($object);

(3)类常量

类常量是在类的内部定义的常量。一般是供类自己调用,而不是给类的对象调用。

<?php     class COMPUTER{

    const ONE=1; // const定义类常量

    const TWO=self::ONE+1; 

 //使用self来调用类常量,而不是用$this前者代表类自己,后者代表一个实例化对象)。

}

echo (COMPUTER::TWO);

?>

        :: 作用域限定操作符 (Scope Resolution Operator)可以引用类里面的常量,静态方法或者静态属性,而且不需要实例化。如在类外调用类的TWO属性。直接echo(COMPUTER::TWO);

也常结合parent用

class SubClass extends BaseClass {

    function __construct() {

        parent::__construct();

        print "我是 SubClass 下的构造函数\n";

    }

}

(4)extends(继承)与final关键字

final关键字后的类不允许继承,final关键字后的方法不能被重写

final class parent{}

(5)namespace命名空间

a.   文件1 namespace xx\xxxxx\xxxxx;

文件2 namespace xx\xxxxx;

假设文件1,2都有一个同名的类A,要在文件3使用两个A。建议在文件3 include两个文件后。用如下语句

use xx\xxxxx\xxxxx\A;

use xx\xxxxx\A as A2; //给文件2的A起个别名

b.  函数的处理方法有点不同,假设同名函数A().在文件3中用如下语句,多了个function.且use时函数名没有双括号

use function xx\xxxxx\xxxxx\A;

use function xx\xxxxx\A as A2; //给文件2的A()起个别名

c.常量则是将function换成const

d.在指定命名空间的文件内调用全局的类,函数,常量。需要在类,函数,常量前加反斜杠\  否则会把被调用的东西当做在该命名空间内的

加入反斜杠\  否则Test1()会被当做index\Test1()

(6)类的自动重载 

使用更先进的spl_autoload_register()函数。可以省去在main文件开头的一大串include "filename.php"

而一次性引入。

自动重载可以在文件中试用另一个文件的类。并且无需include。此处test类来源于另一文件test.php。当直接实例化时,发现本文件没有该类的声明,于是执行重载函数。$classname的值就是classes\test,即命名空间加类名。

下图的test文件内定义了test类,并声明了命名空间,在main中使用了test类。

test.php的命名空间是classes。不是modul\classes。否则$classname=modul\classes\test ,就变成                        require  modul\classes \test.php            main.php所在路径下无modul文件夹,无法引入。

建议在各个类文件中一来就定义命名空间 namespace xx\xxx\xxxx。且命名空间加上类名与该文件的项目路径一致。 

(7)static静态属性和方法

static过后的类和方法,相当于属于该类,可以不用实例化类。直接在类外用类名调用。在类的内部调用静态方法或静态属性用 self::xxx

静态方法同理

(8)后期静态绑定(static)

正常情况如下图所示,输出是 “A类的who方法”   self指的A类

没有静态绑定,虽然是B调用test(),但test()内的self还是指A类

下图是加了静态绑定static,会根据上下文判断当前调用的是谁,输出是“B类的who方法”

将self替换成static

(9)魔术方法

1. __set($name,$value){   

    $this->$name=$value;  // 用$this访问属性$name时,要加$(否则会把name当成一个固定的属性处理,而此处的$name显然是一个变量,意义是类里面的任何私有属性),而正常情况下对象访问属性取值是没有$的

}

2.__get($name){

    return $this->$name;

}

3.__isset($name){

    return isset($this->$name); //类外对象调用isset()查看私有属性是否存在时 

                                                //会首先访问__isset()查看是否存在该 私有属性

}

4.__unset()与上面同理

5.__call()方法 当在类外调用不存在的方法时,会转去执行__call()方法。这样程序不会因为找不到方法而终止,会继续执行下去

6.__callStatic()方法 针对静态方法

7.__invoke()  把对象当函数使用。参数传给__invoke()。

8.__toString()  直接打印对象时被调用

(10)对象拷贝和类型约束

1.   浅拷贝  (默认)

      $a=new A();

      $b=$a;  //浅拷贝a b指向同一块内存区,改变b的属性,a的属性也会变

2.深拷贝

        $a=new A();

         $b=clone $a;  //深拷贝,b的改变不会影响a 更占内存

3.__clone()魔术方法 解决作为属性值的对象的深拷贝

4. 类型约束 

就是 A $a;  //变量a时A类型的对象

相关文章

网友评论

      本文标题:2019-01-14

      本文链接:https://www.haomeiwen.com/subject/mvgddqtx.html