1. 实例演示四个属性重载的魔术方法的使用方式
__get($name):当获取未定义可不见属性时触发 读操作
实例
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,'
';
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__set($name, $value):当给未定义可不见属性赋值时触发 写操作
实例
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,'
';
$obj->salary = '565';
echo $obj->salary;
echo '
';
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__isset($name): 当检测未定义可不见属性时触发
实例
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,'
';
$obj->salary = '565';
echo $obj->salary;
echo '
';
echo isset($obj->salary) ? '存在' : '没有';
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
__unset($name): 当注销未定义可不见属性时触发
实例
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,'
';
$obj->salary = '565';
echo $obj->salary;
echo '
';
echo isset($obj->salary) ? '存在' : '没有';
unset($obj->salary);
echo $obj->salary;
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
实例
namespace _1008;
function sum($a, $b) {
return $a . ' + ' . $b . ' = ' . ($a+$b);
}
// 正常函数调用
echo '正常函数调用: '.sum(20, 40);
echo '
';
// 对象方式调用
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 '
';
// 回调方式数组
echo '回调的方式执行该数组:'. call_user_func_array(__NAMESPACE__.'\sum',[8,99]);
echo '
';
$obj = new Test1();
echo '回调的方式执行该对象:'. call_user_func_array([$obj, 'sum'],[20,53]);
echo '
';
// ::class ,返回一个带有命名空间的类名称
//echo '
',Test1::class;
echo '回调的方式执行该类:'. call_user_func_array([Test2::class, 'sum'], [15,22]);
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
3. 实例演示方法重载的实现原理与参数获取方式
实例
class Demo4
{
// __call(): 访问不存在/不可见对象方法时触发,有两个参数,第一个是方法名,第二个方法的参数
public function __call($name, $args)
{
return '方法是:'. $name . '
参数列表:
'.print_r($args,true);
}
// __callStatic(): 访问不存在/不可见的类方法(静态)方法时触发
public static function __callStatic($name,$arguments)
{
return '方法是:' . $name . '
参数列表:
' . print_r($arguments,true);
}
}
echo '
';
$obj = new Demo4();
echo $obj->getInfo1(10,20,30);
echo Demo4::getInfo2('html','css','js');
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
实例
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);
}
}
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
实例
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 '
';
}
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例