Correction status:qualified
Teacher's comments:数据表中的手机, 可是有年头了, 全听说过了, 今年至少36
实例演示四个属性重载的魔术方法的使用方式
<?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; ?>
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]); ?>
运行效果图
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');
运行效果
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); } }
运行效果图
累死我了终于搞出来,还有朱老师你忘上传表给我们了,然后我自己搞了表,夸我。