Blogger Information
Blog 20
fans 1
comment 2
visits 16806
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
演示属性重载的魔术方法,回调执行函数,对象,类,方法重载和数据库链接调用的原理和过程 补1008作业
月迎下弦的博客
Original
1209 people have browsed it

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


s11.jpg


实例

<?php 
namespace _1014;
class Task1
{
    private $name;
    protected $Class;
    private $studentID;
    private $message;
    public function __construct($name,$Class,$studentID)
    {
         $this->name=$name;
         $this->Class=$Class;
      $this->studentID=$studentID;
    }
    // 属性重载的方法
    // '__***'   魔术方法:不需要或不允许用户调用,有系统来调用
    // __get():重载了用户对属性的访问
    // __get()属于读操作
    public function __get($name)
    {
       if ($name/**当前属性 */==='name'||$name==='Class'||$name==='studentID' ) {
           return ($this->name/**值 */==='Mr赵'||$this->name==='admin') ? $this->$name : '无权查看' ;
       }
       return $this->$name; //返回的是当前的属性($name)
    }
        //__set(新值的属性名$name,值$value)  属于写操作
    public function __set($name,$value)
    {
        if ($name==='Class') {
  
            return $this->name==='admin1' ? $this->$name=$value : $this->message='无权更改';

        }
        return $this-> $name=$value;//等价于$this->salary=99999  
    }
    public function __isset($name)     //__isset($name) 读操作
    {
        return isset($this->$name);
    }
    public function __unset($name)
    {
        unset($this->$name);
    }
}
$obj = new Task1('Mr赵','三年二班','000001');
$obj1= new Task1('Miss赵','三年二班','000002');
$obj2= new Task1('admin','教师','1');
echo $obj->name.'-'.$obj->Class.'-'.$obj->studentID;
echo '<hr>';
echo $obj1->Class;
echo '<hr>';
$obj2->Class='校长';
echo $obj2->message;
echo '<br>';
echo $obj2->name.'-'.$obj2->Class.'-'.$obj2->studentID;
echo '<hr>';
echo isset($obj1->Class) ? '存在' : '不存在';
echo '<hr>';
unset ($obj1->name);
echo '<br>';
echo $obj1->name;

运行实例 »

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



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


call_fun_arrary.jpg


实例

<?php 
namespace _1014;
function sum($a,$b)
{
    return "{$a}+{$b}=" . ($a+$b);
}
echo     call_user_func_array (__NAMESPACE__ . '\sum' ,[10,11]);
echo    '<hr>';
//在类中
// call_user_func_array([对象,方法],[***,***])
class Task2_1
{
    public  function sum($a,$b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}
$obj = new /**namespace/ (可省略)*/Task2_1();
echo     \call_user_func_array([$obj,'sum'],[21,12]);
echo    '<hr>';
//静态调用方法
class Task2_2
{
    public static function sum($a,$b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}
// ::class :返回一个带有命名空间的类名称
echo    \call_user_func_array([Task2_2::class,'sum'],[34,13]);

运行实例 »

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




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


方法重载.jpg


实例

<?php 
namespace _1014;
class Task3
{
        // __call():访问一个不存在或无权限访问的方法的时候会自动调用
    public function __call($name,$args)
    {
        return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true);
    }
     // __callStatic():访问一个不存在或无权限访问的静态方法的时候会自动调用
     public static function __callStatic($name,$args)
     {
        return '方法是: '. $name. ', 参数列表: <pre>'. print_r($args, true);
     }
}
echo (new Task3())->get(11,22,33);
echo    Task3:: staticGet(111,222,333);

运行实例 »

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




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


Query.jpg


实例

<?php 
namespace _1015;
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;
     }
     public function select()  // 生成SQL语句
     {
         $sql='SELECT ' // 拼装SQL
                    .$this->field  // 字段列表
                    .' FROM '
                    .$this->table  //数据表
                    .$this->where //条件
                    .$this->limit; //显示数量
           $stmt= $this ->pdo->prepare($sql);  // 预处理
                        $stmt->execute();
                        // die($stmt ->debugDumpParams(0)); //查看生成的sql
                        return $stmt->fetchALL(\PDO::FETCH_ASSOC);
     }
}

运行实例 »

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



DB.jpg


实例

<?php 
namespace _1015;
require  'task4.php';
class DB
{
    protected static $pdo = null; // 连接对象
    public static function connection() // 数据库的连接方法
    {
        self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test' , 'root','root' );
    }
    public static function __callStatic($name,$arguments)
    {
        self::connection() ; // 连接数据库
        $query = new Query(self::$pdo);  // 实例化查询类,将连接对象做为参数
        return \call_user_func_array([$query,$name],$arguments);// 调用查询对象$query中的对应的方法
    }
}
$task = DB::table ('task')
                ->field('task_id,name,position')
                ->where('task_id >2')
                ->limit(4)
                ->select();
foreach ($task as  $t) {
    \print_r($t);
    echo    '<br>';
}

运行实例 »

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


Correction status:qualified

Teacher's comments:尽管是把课堂代码几乎抄了一遍, 但是加上了自己解读, 非常不错的
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