Blogger Information
Blog 57
fans 0
comment 0
visits 46976
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
定义静态成员绑定
藍錄的博客
Original
756 people have browsed it

实例

<?php
/**
 * static 关键字的用途:
 * 1. 定义静态成员;
 * 2. 后期静态绑定
 *
 * 后期静态绑定:静态继承的上下文环境,用于动态设置静态方法的调用者
 */
class One
{
    public static function hello()
    {
        return __METHOD__;  // 返回当前方法名
    }

    public static function world()
    {
//        return self::hello();
        return static::hello();
    }
}

class Two extends One
{
    public static function hello()
    {
        return __METHOD__;  // 返回当前方法名
    }
}
// 静态继承上下文执行环境: 静态继承
echo Two::hello();
echo '<hr>';

echo Two::world(); //One::hello
//代码结果看上去似乎是正确的,但是业务逻辑说不通
//在子类Two中将父类中的hello()进行重写,在调用world()时,本意是想调用子类中已重写的方法hello()
// 并不想调用父类的,在父类中却不能正确识别出当前的调用者是哪个?

// 代码执行分二种个阶段: 前期:编译阶段, 后期:运行阶段
// 这种在运行阶段才确定方法的调用者的技术: 后期[运行阶段]静态绑定, 延迟静态绑定

//将 static 想像成一个变量: 始终指向静态方法的调用者

运行实例 »

点击 "运行实例" 按钮查看在线实例

 

实例

<?php
/**
 * 后期静态绑定的小案例
 *
 */
class Db1
{
    public static $pdo = null;
    //连接数据库
    public static function connect()
    {
        self::$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
    }

    public static function query()
    {
        $stmt = self::$pdo->prepare("SELECT `name`,`salary` FROM `staff` LIMIT 3");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public static function select()
    {
        self::connect();
//        return self::query();
        return static::query();
    }

}

class Db2 extends Db1
{
    public static function query()
    {
        $stmt = self::$pdo->prepare("SELECT `name` AS `姓名`,`email` AS `邮箱` FROM `user` LIMIT 3");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
echo '<pre>';
//print_r(Db1::select());
print_r(Db2::select());

运行实例 »

点击 "运行实例" 按钮查看在线实例

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post