__call、__set 和 __get的用法
2015-08-11 13:56
429 查看
1. __call的用法
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
例:__call
Php代码
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!<br>");
print_r($arguments);
print("<br><br>");
}
function doSecond($arguments)
{
print("Right, $arguments!<br>");
}
}
$test = new foo();
$test->doFirst('no this function');
$test->doSecond('this function exist');
?>
2. __call 实现“过载”动作
这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
例:使用 __call 实现“过载”动作
Php代码
<?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
}
private function foo_for_int($x) {
print("oh an int!");
}
private function foo_for_string($x) {
print("oh a string!");
}
}
$test = new Magic();
$test->foo(3);
$test->foo("3");
?>
3. 面向对象重载
Php代码
<?php
/*__call(string $name,array $arg)的用法
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数
*/
class Account{
private $user=1;
private $pwd=2;
public function __call($name,$arg){
switch(count($arg)){
case 2:
echo $arg[0]*$arg[1],PHP_EOL;
break;
case 3:
echo array_sum($arg),PHP_EOL;
break;
default:
echo "参数不对",PHP_EOL;
break;
}
}
}
$a= new Account();
//这里模拟了重载
//重载:一个类中可以定义参数列表不同但名字相同的多个方法
$a->make(5);
$a->make(5,6);
4. 使用__call()方法来实现数据库连贯操作
Php代码
<?php
// 使用__call()方法来实现数据库连贯操作
// 申明一个Db类(数据库操作类)的简单操作模型
class Db{
private $sql = array(
"field" => "",
"where" => "",
"order" => "",
"limit" => "",
"group" => "",
"having" => "",
);
// 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句
function __call($methodName,$args){
// 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称
$methodName = strtolower($methodName);
// 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素
if(array_key_exists($methodName,$this->sql)){
$this->sql[$methodName] = $args[0];
}else{
echo '调用类'.get_class($this).'中的方法'.$methodName.'()不存在';
}
// 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作
return $this;
}
// 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法
function select(){
echo "SELECT {$this->sql['field']} FROM user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']}
{$this->sql['having']}";
}
}
$db = new Db();
// 连贯操作
$db->field('sex, count(sex)')
->where('where sex in ("男","女")')
->group('group by sex')
->having('having avg(age) > 25')
->select();
?>
5. __set 和 __get的用法
这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。
例: __set 和 __get
Php代码
<?php
class foo {
function __set($name,$val) {
print("Hello, you tried to put $val in $name<br>");
}
function __get($name) {
print("Hey you asked for $name<br>");
}
}
$test = new foo();
$test->__set('name','justcoding');
$test->__get('name');
?>
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
例:__call
Php代码
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!<br>");
print_r($arguments);
print("<br><br>");
}
function doSecond($arguments)
{
print("Right, $arguments!<br>");
}
}
$test = new foo();
$test->doFirst('no this function');
$test->doSecond('this function exist');
?>
2. __call 实现“过载”动作
这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
例:使用 __call 实现“过载”动作
Php代码
<?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
}
private function foo_for_int($x) {
print("oh an int!");
}
private function foo_for_string($x) {
print("oh a string!");
}
}
$test = new Magic();
$test->foo(3);
$test->foo("3");
?>
3. 面向对象重载
Php代码
<?php
/*__call(string $name,array $arg)的用法
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数
*/
class Account{
private $user=1;
private $pwd=2;
public function __call($name,$arg){
switch(count($arg)){
case 2:
echo $arg[0]*$arg[1],PHP_EOL;
break;
case 3:
echo array_sum($arg),PHP_EOL;
break;
default:
echo "参数不对",PHP_EOL;
break;
}
}
}
$a= new Account();
//这里模拟了重载
//重载:一个类中可以定义参数列表不同但名字相同的多个方法
$a->make(5);
$a->make(5,6);
4. 使用__call()方法来实现数据库连贯操作
Php代码
<?php
// 使用__call()方法来实现数据库连贯操作
// 申明一个Db类(数据库操作类)的简单操作模型
class Db{
private $sql = array(
"field" => "",
"where" => "",
"order" => "",
"limit" => "",
"group" => "",
"having" => "",
);
// 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句
function __call($methodName,$args){
// 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称
$methodName = strtolower($methodName);
// 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素
if(array_key_exists($methodName,$this->sql)){
$this->sql[$methodName] = $args[0];
}else{
echo '调用类'.get_class($this).'中的方法'.$methodName.'()不存在';
}
// 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作
return $this;
}
// 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法
function select(){
echo "SELECT {$this->sql['field']} FROM user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']}
{$this->sql['having']}";
}
}
$db = new Db();
// 连贯操作
$db->field('sex, count(sex)')
->where('where sex in ("男","女")')
->group('group by sex')
->having('having avg(age) > 25')
->select();
?>
5. __set 和 __get的用法
这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。
例: __set 和 __get
Php代码
<?php
class foo {
function __set($name,$val) {
print("Hello, you tried to put $val in $name<br>");
}
function __get($name) {
print("Hey you asked for $name<br>");
}
}
$test = new foo();
$test->__set('name','justcoding');
$test->__get('name');
?>
相关文章推荐
- Python机器学习库
- 内联汇编
- C++和Java继承的不同
- thrift客户端调用不支持多线程方式,非线程安全
- pythonchallenge(一)
- bootstrap multiselect学习网址
- 架构师
- Jabber 创建一个application dial rule
- Jabber 创建一个application dial rule
- postgresql模式与数据库的关系
- php发送邮件二种方法 php使用smtp发送邮件
- leetCode #217 Contains Duplicate
- MySQL 获得当前日期时间(以及时间的转换)
- transient 字段反序列化后是字段类型默认值
- 从Theano到Lasagne:基于Python的深度学习的框架和库
- C++函数的定义与调用
- div模拟textarea
- Finereport在企业级BI分析中的应用
- fastJson和Gson的比较
- android 资源文件命名规范