设为首页 收藏本站
查看: 924|回复: 0

[经验分享] PHP中的Magic Method

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-25 12:12:59 | 显示全部楼层 |阅读模式
  1. __construct()__destruct()
  在实例被 创建/销毁 的时候被调用,都可以传递0个或多个参数。



  class A
{
function A()
{
echo "build A";
}
function __destruct()
{
echo "destroy A";
}
}
$obj = new A();
//unset($obj);
  Note:The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.
  关于构造函数,PHP5.3.3开始,一个定义在某个特定的命名空间里的class中以类名命名的方法将不再被认为是构造函数。在无命名空间的类中与原来一样依旧是构造函数。如:



namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method as of PHP 5.3.3
    }
}
  如果没有namespace Foo; 那么Bar()还将被当作构造函数。另外,如果存在下面的情况:



  function __construct()
{
echo "construct A";
}
function A()
{
echo "build A";
}
function __destruct()
{
echo "destroy A";
}
}
  即既包含__construct()又包含与类名同名的函数,那么将只调用__construct()。
  
  2. __call()__callStatic()
    当尝试调用一个不存在的方法时调用该方法。两个参数,一个是方法名,一个是被调用方法的参数数组。



class MethodTest
{
public function __call($name, $arguments)
{
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(' ', $arguments). "<br>";
}
public static function __callStatic($name, $arguments)
{
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(' ', $arguments). "<br>";
}
}
$obj = new MethodTest;
$obj->runTest('in','object','context');
MethodTest::runTest('in','static','context');
  其中,$arguments作为一个array传入。运行结果:



Calling object method 'runTest' in object context
Calling static method 'runTest' in static context
  还要注意函数的作用域protected和private:



class TestMagicCallMethod {
public function foo()
{
echo __METHOD__.PHP_EOL."<br>";
}
public function __call($method, $args)
{
echo __METHOD__.PHP_EOL."<br>";
if(method_exists($this, $method))
{
$this->$method();
}
}
protected function bar()
{
echo __METHOD__.PHP_EOL."<br>";
}
private function baz()
{
echo __METHOD__.PHP_EOL."<br>";
}
}
$test    =    new TestMagicCallMethod();
$test->foo();
/**
* Outputs:
* TestMagicCallMethod::foo
*/
$test->bar();
/**
* Outputs:
* TestMagicCallMethod::__call
* TestMagicCallMethod::bar
*/
$test->baz();
/**
* Outputs:
* TestMagicCallMethod::__call
* TestMagicCallMethod::baz
*/
  
  3.__get()__set()
  当试图读取一个对象并不存在的属性的时候被调用。
  Note:我们可以用这个函数实现类似java中反射的各种操作。



class Test
{
public function __get($key)
{
echo $key . " not exists";
}
public function __set($key,$value)
{
echo $key . " = ".$value;
}
}
$t = new Test();
echo $t->name."<br>";
$t->name = "abc";
输出:
name not exists
name = abc
  4. __toString()
    这个方法类似于java的toString()方法,当我们直接打印对象的时候回调用这个函数,函数必须返回一个string。



class Test
{
private $name = "abc";
private $age = 12;
public function __toString()
{
return "name : $this->name, age : $this->age";
}
}
$t = new Test();
echo $t;
输出:
name : abc, age : 12
  
  还有__isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() and __clone()就不一一赘述。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104011-1-1.html 上篇帖子: php+phpquery简易爬虫抓取京东商品分类 下篇帖子: php程序员应具有的7种能力
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表