PHP核心技术——魔术方法
魔术方法:
- 魔术方法是以两个下画线开头、具有特殊作用的一些方法,可以看做PHP的“语法糖”。
set和get方法:
class Account{
private $user=1;
private $pwd=2;
public function __set($name,$value)
{
echo "Setting".$name." to ".$value."\r\n";
$this->$name=$value;
}
public function __get($name)
{
if (!isset($this->$name)) {
echo "not default";
$this->$name="setting default";
}
return $this->$name;
}
}
$a=new Account();
echo $a->user;
echo "-----------\n";
$a->name=5;
echo $a->name;
echo "-----------\n";
echo $a->big;
- 而PHP则在一个类中只允许有一个构造函数
- PHP提供的“重载”指动态地“创建”类属性和方法。因此,set和get方法被归到重载里。
call和callStatic方法:
- 当调用一个不可访问的方法(如未定义,或者不可见)时,call()会被调用。其中name参数是要调用的方法名称。arguments参数是一个数组,包含着要传递给方法的参数
class callFun
{
public function __call($name,$arguments)
{
switch (count($arguments)) {
case 2:
echo $arguments[0]*$arguments[1],PHP_EOL;
break;
case 3:
echo array_sum($arguments),PHP_EOL;
break;
default:
echo 'wrong',PHP_EOL;
break;
}
}
}
$a =new callFun;
$a->make(5);
$a->make(5,6);
- 这段代码通过使用callStatic这一魔术方法进行方法的动态创建和延迟绑定,实现一个简单的ORM模型。
abstract class ActiveRecord{
protected static $table;
protected $fieldvalues;
public $select;
static function findById($id){
$query="select * from ".static::$table." where id=".$id;
return self::createDomain($query);
}
function __get($fieldname){
return$this->fieldvalues[$fieldname];
}
static function __callStatic($method,$args){
$field=preg_replace('/^findBy(\w*)$/','${1}',$method);
$query="select * from ".static::$table." where ".$field."=".$args[0];
return self::createDomain($query);
}
private static function createDomain($query){
$klass=get_called_class();
$domain=new $klass();
$domain->fieldvalues=array();
$domain->select=$query;
foreach($klass::$fields as $field=>$type){
$domain->fieldvalues[$field]='TODO:set from sql result';
}
return $domain;
}
}
class Customer extends ActiveRecord{
protected static $table='custdb';
protected static $fields=array(
'id'=>'int',
'email'=>'varchar',
'lastname'=>'varchar'
);
}
class Sales extends ActiveRecord{
protected static $table='salesdb';
protected static $fields=array(
'id'=>'int',
'item'=>'varchar',
'qty'=>'int'
);
}
assert("select * from custdb where id=123"==Customer::findById(123)->select);
assert("TODO:set from sql result"==Customer::findById(123)->email);
assert("select * from salesdb where id=321"==Sales::findById(321)->select);
assert("select * from custdb where Lastname='Denoncourt'"==Customer::findByLastname('Denoncourt')->select);
toString方法:
- 当进行测试时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象将报错,例如“Catchable fatal error:Object of class Account could not be converted to string”语法错误,实际上这是一个类型匹配失败错误。不过仍然可以用print_r()和var_dump()函数输出一个对象。当然,toString是可以定制的,所提供的信息和样式更丰富。
class Account
{
public $user=1;
private $pwd=2;
//自定义的格式化输出方法
public function __toString()
{
return "{$this->user}, {$this->pwd}";
}
}
$a = new Account();
echo $a;
echo PHP_EOL;
print_r($a);
参考资料
- [PHP核心技术与最佳实践]
PHP核心技术——魔术方法的更多相关文章
- PHP中的魔术方法和魔术常量
看上去好像挺烦人,但只要通过例子测试一下,就明白了.不做测试,只是看,第二天还是不明白.当然我在抄其他人的日志,然后希望能是自己的理解就好,原文地址PHP的魔术方法和魔术敞亮简介和使用--LaraBo ...
- PHP基础知识之魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
- PHP中的魔术方法(2)
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
- 魔术方法__sleep 和 __wakeup
感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...
- Python魔术方法-Magic Method
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...
- php魔术方法使用场景
php魔术方法-----__tostring(),__invoke,__call(),__callStatic ... __tostring(),__invoke() __tostring()方法是在 ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP 类中的魔术方法
定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...
随机推荐
- LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数
要 运行 LWIP 不光 要实现 OS 的 一些 接口 ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给 LWIP ,去解析 做出相应的 应答 ,2017 ...
- 鼠标不能用怎么办 USB OPTICAL MOUSE
刚买的新鼠标,一般鼠标插上去自动安装驱动,然后就可以正常使用了. 如果遇到下面这种情况:"usb optical mouse 找不到驱动程序" 插上以后死活都没作用,然后开始下载一 ...
- POJ 3762 The Bonus Salary!(最小K覆盖)
POJ 3762 The Bonus Salary! 题目链接 题意:给定一些任务.每一个任务有一个时间,有k天.一个时间仅仅能运行一个任务,每一个任务有一个价值.问怎么安排能得到最多价值 思路:典型 ...
- 【转】:Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级
为方便截图,本文操作都在vmware虚拟机上完成. 目录: 1.操作系统安装 2.数据库安装 3.PSU补丁升级卸载 part1 操作系统安装 Oracle (Enterprise) Linux ...
- WebGl 利用缓冲区对象画多个点
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- PL/SQL报错:ORA-28000:the account is locked
第一种方法(图形操作):第一步:使用PL/SQL,登录名为system,选择类型的时候把Normal修改为SYSDBA:第二步:选择users下的system,右击点击“编辑”: 第三步:修改密码,把 ...
- Redis推荐阅读笔记整理
Herrt灬凌夜 https://www.cnblogs.com/wuyx/archive/2018/03.html 6. Redis_常用5大数据类型简介 5. redis_安装 4. Red ...
- 远程查看java虚拟机内存使用情况jconsole
jconsole 查看虚拟机使用情况 1.在远程机的tomcat的catalina.sh中加入配置: JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.host ...
- DMZ靶场渗透
0x00 目标站点www.test.ichunqiu 0x01 尝试登陆系统 -尝试弱密码登陆 结果:forbidden!!! -尝试万能账号密码登陆 1‘ or 1=1--+ 和 1‘ or 1=1 ...
- 修改并编译golang源码
最近为了做Hyperledger Fabric国密改造,涉及到了golang源码的改动.特将操作过程整理如下,以供参考: golang的源码安装其实比较简单,只需运行源码包中的脚本src/all.ba ...