博客列表 >类常量,属性重载,方法重载,数据库连接及静态方法重载实现-2019-10-10

类常量,属性重载,方法重载,数据库连接及静态方法重载实现-2019-10-10

H先生
H先生原创
2019年10月10日 20:02:59831浏览

1. 实例演示四个属性重载的魔术方法的使用方式

    __get($name):当获取未定义可不见属性时触发  读操作


QQ截图20191010141218.png




实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    public function __get($name)
    {
        return $this->$name;
    }

}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

?>

运行实例 »

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



  __set($name, $value):当给未定义可不见属性赋值时触发  写操作



111.png






实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';


?>

运行实例 »

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



    __isset($name): 当检测未定义可不见属性时触发

QQ截图20191010143701.png




实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
    // __isset($name): 当检测未定义可不见属性时
    public function __isset($name)
    {
        return isset($this->$name);
    }
   


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';

echo isset($obj->salary) ? '存在' : '没有';

?>

运行实例 »

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


    __unset($name): 当注销未定义可不见属性时触发


2223.png






实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
    // __isset($name): 当检测未定义可不见属性时
    public function __isset($name)
    {
        return isset($this->$name);
    }
    //__unset($name): 当注销未定义可不见属性时触发
    public function __unset($name)
    {
        unset($this->$name);
    }


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';

echo isset($obj->salary) ? '存在' : '没有';
unset($obj->salary);
echo $obj->salary;


?>

运行实例 »

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




2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式


1.png





实例

<?php

namespace _1008;

function sum($a, $b) {
    return $a . ' + ' . $b . ' = ' . ($a+$b);
}

// 正常函数调用
echo '正常函数调用: '.sum(20, 40);
echo '<hr>';

// 对象方式调用
class Test1
{
    public function sum($a,$b)
    {
//        return "$a + $b = " . ($a + $b);
        return $a . ' + ' . $b .' = ' . ($a + $b);
    }
}

// 对象方式静态调用
class Test2
{
    public static function sum($a,$b)
    {
//        return "$a + $b = " . ($a + $b);
        return $a . ' + ' . $b .' = ' . ($a + $b);
    }
}

//echo call_user_func('\_1008\sum',20,60);
// 以回调的方式执行该函数
echo '回调的方式执行该函数:'.call_user_func(__namespace__.'\sum',20,60);
echo '<hr>';
// 回调方式数组
echo '回调的方式执行该数组:'. call_user_func_array(__NAMESPACE__.'\sum',[8,99]);

echo '<hr>';
$obj = new Test1();
echo '回调的方式执行该对象:'. call_user_func_array([$obj, 'sum'],[20,53]);
echo '<hr>';
// ::class  ,返回一个带有命名空间的类名称
//echo '<hr>',Test1::class;
echo '回调的方式执行该类:'. call_user_func_array([Test2::class, 'sum'], [15,22]);



?>

运行实例 »

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



    3. 实例演示方法重载的实现原理与参数获取方式




1.png






实例

<?php

class Demo4
{
    // __call(): 访问不存在/不可见对象方法时触发,有两个参数,第一个是方法名,第二个方法的参数
    public function __call($name, $args)
    {
        return '方法是:'. $name . '<br>参数列表:<pre>'.print_r($args,true);
    }

    // __callStatic(): 访问不存在/不可见的类方法(静态)方法时触发
    public static function __callStatic($name,$arguments)
    {
        return '方法是:' . $name . '<br>参数列表:<pre>' . print_r($arguments,true);
    }
}
echo '<hr>';
$obj = new Demo4();
echo $obj->getInfo1(10,20,30);

echo Demo4::getInfo2('html','css','js');


?>

运行实例 »

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



    4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)





1.png






实例

<?php
namespace _1008;

// 查询数据库类
class Query
{
    // 1. 连接对象
    public $pao = null;

    // 2. 表名
    public $table;

    // 3. 字段 * 查询所有字段
    public $field = '*';

    // 4. 条件
    public $where;

    // 5. 数量
    public $limit;


    // 6.连接数据库,用构造方法
    public function __construct($pdo)
    {
        // 注:实例化时自动连接上数据库
        $this->pdo = $pdo;

    }
    // 7. 设置数据表名称
    public function table($tableName)
    {
        $this->table = $tableName;
        //注:返回当前实例,用来链式调用后面的其他方法
        return $this;
    }
    // 8. 设置数据库字段
    public function field($fields = '*')
    {
        $this->field = empty($fields) ? '*' : $fields;
        return $this;
    }
    // 9. 设置查询条件
    public function where($where = '')
    {
        $this->where = empty($where) ? $where : ' WHERE '.$where;
        return $this;
    }
    // 10. 设置显示数量
    public function limit($limit)
    {
        $this->limit = empty($limit) ? $limit : ' LIMIT '. $limit;
        return $this;
    }
    // 11. 生成sql语句
    public function select()
    {

       // SELECT * FROM table WHERE **** LIMIT n
        // 注:拼装sql
        $sql = 'SELECT '
            . $this->field // 字段列表
            . ' FROM '
            . $this->table // 数据表
            . $this->where // 条件
            . $this->limit; // 显示数量
        // 预处理
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
           //die($stmt->debugDumpParams()); // 查看生成SQL语句
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }

}


?>

运行实例 »

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



实例

<?php

<?php
namespace _1008;

require 'Query.php';
class DB
{
    // Q 1.1 链接对象
    protected static  $pdo = null;


    // 数据库的链接方法
    public static function connection()
    {
       self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=php','root' ,'root');
    }

    public static function __callStatic($name, $arguments)
    {
        // 连接 数据库
        self::connection();
        // 实例化查询类 ,连接对象作为参数
        $query = new Query(self::$pdo);
        return call_user_func_array([$query,$name],[$arguments[0]]);

    }
}


$staffs = DB::table(' staff')
    ->field(' staff_id,name,position,mobile')
    ->where('staff_id > 5')
    ->select();
foreach ($staffs as $staff){
    print_r($staff);echo '<br>';
}




?>

运行实例 »

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




















































声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议