• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第7章 属性重载与命名空间和类自动加载器【缺课】

Data: 2016-10-17 04:16:27Form: JournalClick: 4

属性重载

<?php
/**
 * 1.属性重载:属性的访问拦截 __get(),__set()
 */
class User
{
    //  属性
    private $data = [
        'age' => 20
    ];
    //访问拦截器
    public function __get($name)
    {
        //$name:属性名
        // array_key_exists():查询数组中是否存在某一个键
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return "属性 {$name} 不存在";
    }
    // 更新拦截器
    public function __set($name, $value)
    {
        // 1.有没有这个属性
        if (array_key_exists($name, $this->data)) {
            //    2.属性是否合法
            if ($name === 'age') {
                if ($value > 18 && $value < 59) {
                    $this->data[$name] = $value;
                } else {
                    echo '年龄必须在18~59之间';
                }
            } else {
                // 以上操作只对age有效,其他属性直接赋值
                $this->data[$name] = $value;
            }
        } else {
            echo '禁止动态创建属性';
        }
    }
    // 方法拦截器
    public function __call($name, $args)
    {
        //$name:方法名   $args:传给方法的参数
        printf('方法:%s<br>参数:<pre>%s</pre>', $name, print_r($args, true));
    }
    // 静态方法拦截器
    // php5.3以后增加了__callStatic方法
    // 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法
    public static function __callstatic($name, $args)
    {
        //$name:方法名   $args:传给方法的参数
        printf('方法:%s<br>参数:<pre>%s</pre>', $name, print_r($args, true));
    }
}
$user = new User;
echo $user->name . '<hr>';
/**
 * 为一个属性赋值的时候,必须要搞清楚两件事
 * 1.有没有这个属性
 * 2.属性是否合法
 */
$user->age = 25;
echo $user->age . '<hr>';
// 常规方法/非静态方法/用实例调用
$user->hello('猪老师', 'PHPCN');
// 静态方法
$user::world(100, 200);

image.png


命名空间

<?php
/**
 * 命名空间:解决全局成员的命名冲突
 */
//一个脚本中,可以创建多个空间
namespace ns1 {
    //空间成员
    //常量
    const APP = '商场';
}
//  空间分级管理:子空间
namespace ns2\ns3 {
    const APP = '问答';
    echo APP . '<br>';
}
namespace ns2 {
    //空间成员
    //常量
    const APP = '社区';
    //2.非限定名称:总是从当前空间开始查询
    echo APP . '<br>';
    // 查询当前命名空间函数__NAMESPACE__
    echo __NAMESPACE__ . '<br>';
    // 想在ns2中,访问ns1的APP
    // 一定要通过全局空间/根空间来进行访问
    // 根空间:\
    //1. 完全限定名称:从根空间开始查询
    echo \ns1\APP . '<br>';
    // 在ns2空间,访问子空间,ns2\ns3中的成员
    // 3.限定名称:ns3\APP
    echo '<span style="color:red">' . ns3\APP . '</span><br>';
}
/**
 * 命名空间类型
 * 1.完全限定名称:根空间开始,a\b\APP
 * 2.非限定名称:从当前空间开始,'APP'
 * 3.限定名称:子空间,ns\APP
 */
//全局空间:匿名的,不要写空间名,用“\”来引用
namespace {
    function hello()
    {
        echo 'hello';
    }
    echo '<span style="color:blue">' . ns1\APP . '</span><br>';
    echo '<span style="color:yellow">' . \ns2\ns3\APP . '</span><br>';
}

image.png

类自动加载器

<?php
/**
 * 命名空间
 * 1.一个文件中,只允许声明一个命名空间并只写一个类
 * 2.命名空间的命名,应该和成员的路径一致
 * 3.类名必须和类文件对应
 */
//类文件自动加载器
// 注册一个类的自动加载器
spl_autoload_register(function ($class) {
    //1.将命名空间=>映射到一个类文件的绝对路径
    $path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
    //2.生成类文件路径
    $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
    // 3.加载这个类文件
    require $file;
});



Name:
<提交>