20171115

构造方法和析构方法

构造方法:__construct()

析构方法:__destruct()

释放类有很多种方法,比如:置为null,使用unset(Object)等等

类常量

关键字:const

调用方式:self::

类的继承

关键字:extends

这里大家需要了解一下private、protected、public的使用

子类可以覆盖父类的方法

子类在创建对象的时候,如果子类中没有构造方法,则会往父类中查找

如果子类中有构造方法,则会直接执行子类的构造方法

如果在子类中想调用父类的构造方法,则需要使用parent::__construct()

final关键字

如果类不希望被继承,则可以在class前边加上final关键字

如果类中的方法不希望被重写,则在Function前边加上final关键字即可

命名空间(namespace)

设置命名空间:

namespace ns1\ns2;

使用方式:

  • 使用\,例如ns1\ns2\XX
  • 使用use,例如use ns1\ns2\XX

命名空间设置别名:

引入命名空间中的类:use ns1\ns2\XX as XXX

引入命名空间中的方法:use function ns1\ns2\func;

引入命名空间中的常量:use const ns1\ns2\co;

命名空间可以分为:指定命名空间、全局命名空间

在指定命名空间中调用全局命名空间中的类,是错误的,需要这样:new \Test(),来告诉程序去全局命名空间中查找这个类。但是可以直接调用全局命名空间中的方法或者常量。注意:如果当前命名空间中有该方法或者常量的话,就会执行当前命名空间中的方法或者常量。

类自动加载

在编程中,肯定会同时引用大量的类,可以使用__autoload,如下:

function __autoload($className) 
{
    require $className . ".php";
}

但是此方法不经常使用,因为PHP后边的版本会剔除掉此方法,目前大家常用的是spl_autoload_register例如:

spl_autoload_register(function ($className) {
    require $className . ".php";
});

此方法的参数是一个方法,这里使用了匿名函数,当然也可以在外边声明一个函数,然后这里边放入函数名即可;同时也可以这样:

class Demo
{

    function autoload($className)
    {
        require $className . ".php";
    }
}

spl_autoload_register([new Demo, 'autoload']);

在项目中,一般建议命名空间加上这个类的名字是等于这个文件的路径的

例如:

  • 我创建一个model文件夹,在此文件夹中创建一个demo.php文件
  • 在demo.php文件中创建一个demo类
<?php

namespace model;

class Demo
{
    public function nice() 
    {
        echo "Demo nice";
    }
}
  • 在其他路径下的PHP文件中就可以使用以下方法来自动加载类
spl_autoload_register(function ($className) {
    require str_replace("\\", "/", $className . ".php");
});

注意:str_replace为字符串替换的方法,str_replace(search, replace, subject)

static 关键字

如果在类的属性上加上static之后,那么这个属性就成了类的属性,而不是对象的属性了,只能通过类名+双冒号+属性名来调用,方法也是同样的。

static声明的方法中不能使用this,this代表一个类的实例,self才是类的本身。

在子类中可以使用parent来访问父类中的静态属性和方法。

后期静态绑定

看下边的例子:

<?php

class A
{
    public static function who()
    {
        echo "A类的who方法";
    }

    public static function test()
    {
        self::who();
    }
}

class B extends A
{
    public static function who()
    {
        echo "B类的who方法";
    }
}


B::test();
// 这个打印大家可以看出来,打印的是“A类的who方法”
// 那么怎么才能打印B类中重写的who方法呢?

// 方法就是把self改成static关键字即可

魔术方法

  • __set()
  • __get()

正常私有属性可以通过自定义get和set方法来提供给外界的读取和修改,但是如果这种属性特别多的话,就会出现很多重复的代码,这个时候就可以使用这两个魔术方法来解决,例如:

class Test
{
    private $abc = '';
    private $def = '';

    public function __set($var, $val)
    {
        this->$var = $val;
    }

    public function __get($var)
    {
        return $this->$var;
    }
}

$test = new Test();
$test->abc = 'abc';
echo $test->abc;
最后更新于 16th Nov 2017