成员重载与实战2019/10/8

2022年02月16日 04:21:43阅读数:578博客 / 西门吃雪 / php梳理
  1. 实例演示四个属性重载的魔术方法的使用方式  

<?php 

namespace _1008;

// 属性重载:当我们在类的外部访问一个不存在或者没有权限访问一个实例成员的时候,会被自动调用
//我们应用一套机制进行检查和处理.
//我们把它叫做属性重载
//
// __get(), __set(), __isset(), __unset()
class Demo33
{

	private $name;
	private $salary;
	protected $secret = '一群老母***队掉进了水沟里';

	public function __construct($name,$salary)
	{
		$this->name = $name;
		$this->salary = $salary;
	}

	//属性重载的方法
	//魔术方法: 不需要或不允许用户调用,由系统来调用
	//__get(): 重载了用户对属性的访问
	//__get()是读操作
	public function __get($name)
	{
		return $this->$name;
	}
	//__set($name,$value):写操作
	public function __set($name,$value)
	{
		$this->$name = $value;//这行代码最终解析成 $this->salary = 8888;
	}
	//__isset($name)检测变量是否存在
	public function __isset($name)
	{
		return isset($this->$name);
	}
	//__unset($name)//删除操作
	public function __unset($name)
	{
		unset($this->$name);
	}

}

$obj = new Demo33('戒', 6666);

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

$obj->salary = 8888;//  salary代表$name  8888=$value
echo $obj->salary;
echo '<hr>';
echo isset($obj->salary) ? '存在' : '没有';
unset($obj->salary);
echo $obj->$salary;










 ?>

QQ截图20191009214850.jpg


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

<?php 


namespace _1008;
function sum($a,$b)
{
	return "{$a} + {$b} = " . ($a + $b);
}
echo sum(13,56);
echo '<br>';


// call_user_func(function:要执行的回调函数,...parameter:参数1,参数2);
// echo call_user_func('\_1008\sum',54,81);
// echo __NAMESPACE__;
echo call_user_func(__NAMESPACE__. '\sum', 45, 78);

echo '<hr>';

echo call_user_func_array(__NAMESPACE__. '\sum', [68, 95]);

echo '<hr>';

class Test1
{
    public function sum($a, $b)
    {
        return "{$a} + {$b} = " . ($a + $b);
    }
}


$obj = new Test1();
echo '<hr>';
// // 对象中的方法以回调的方式调用
// echo call_user_func_array([$obj, 'sum'], [45, 23]);
echo call_user_func_array([new Test1(), 'sum'], [45, 23]);

echo '<hr>';
class Test2
{
    public static function sum($a, $b)
    {
        return "{$a} + {$b} = " . ($a + $b);
    }
}

echo call_user_func_array(__NAMESPACE__.'\Test2::sum', [25, 45]);
// ::class  ,  返回一个带有命名空间的类名称
//echo '<br>'. Test2::class;
echo '<hr>';
echo call_user_func_array([Test2::class, 'sum'], [300, 200]);






 ?>


运行效果图

QQ截图20191010022023.jpg

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

// 方法重载
class Demo4
{
    // __call(): 访问一个不存在或无权限访问的方法的时候会自动调用
    public function __call($name, $args)
    {
        return '方法是: '. $name. '<br>参数列表: <pre>'. print_r($args, true);
    }

    // __callStatic(): 访问一个不存在或无权限访问的静态方法的时候会自动调用
    public static function __callStatic($name, $args)
    {
        return '方法是: '. $name. '<br>参数列表: <pre>'. print_r($args, true);
    }
}
echo '<hr>';
$obj = new Demo4();
echo $obj->getInfo1(10,20,30);

echo '<hr>';

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

运行效果QQ截图20191010032104.jpg

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

<?php
namespace _1008;

require 'Query.php';

class DB
{
    // 连接对象
    protected static $pdo = null;

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

    public static function __callStatic($name, $arguments)
    {
       // 连接数据库
        self::connection();
        // 实例化查询类,将连接对象做为参数
        $query = new Query(self::$pdo);
        // 调用查询对象$query中的对应的方法
        return call_user_func_array([$query, $name],$arguments);
    }
}

$staffs = DB::table('goods')

    ->field('goods_id,cat_id,goods_name,shop_price,market_price,goods_number,click_count,goods_weight   ')
    ->where('goods_id > 2')
    ->limit(20)

->select();




// 遍历
foreach ($staffs as $staff) {
    print_r($staff); echo '<br>';
}




?>

query.php文件原封没动也写出来吧

<?php


namespace _1008;

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

    // 表名
    public $table;

    // 字段
    public $field = '*';

    // 条件
    public $where;

    // 数量
    public $limit;

    // 构造方法
    public function __construct($pdo)
    {
        // 实例时自动连接数据库
        $this->pdo = $pdo;
    }

    // 设置数据表名称
    public function table($tableName)
    {
        $this->table = $tableName;
        //返回当前类实例, 用来链式调用后面的其它方法
        return $this;
    }

    // 设置数据表字段
    public function field($fields = '*')
    {
        $this->field = empty($fields) ? '*' : $fields;
        return $this;
    }

    // 设置查询条件
    public function where($where = '')
    {
        $this->where = empty($where) ? $where : ' WHERE '. $where;
        return $this;
    }

    // 设置显示数量
    public function limit($limit)
    {
        $this->limit = empty($limit) ? $limit : ' LIMIT '. $limit;
        return $this;
    }

    // 生成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);
    }

}

运行效果图

QQ截图20191010081047.jpg

 累死我了终于搞出来,还有朱老师你忘上传表给我们了,然后我自己搞了表,夸我。

批改状态:合格

老师批语:数据表中的手机, 可是有年头了, 全听说过了, 今年至少36

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    西门吃雪
    博文
    26
    粉丝
    0
    评论
    3
    访问量
    16007
    积分:0
    P豆:60