2012-08-14 59 views
2

调用关于重载的手册,我无法掌握其中的一个线程。代码如下:如何从非实例化类

<?php 

class a 
{ 
    function __get($v) 
    { 
     $this->$v = new $v; 
     return $this->$v; 
    } 
} 

class b 
{ 
    function say($word){ 
     echo $word; 
    } 
} 
$a = new a(); 
$a->b->say('hello world'); 

// echos 'hello world' 
?> 

正如它在注释行中指出的那样,它呼应了hello world。但即使b没有被实例化,它是如何被调用的?请帮帮忙,链接手册here,条目是属于用户名为一下Gmail点com trash80

+2

作为'$ A-> B'没有定义, '$ a - > __ get('b')'被调用。然后它实例化类'b'并返回那个用于'b :: say('hello world')''的实例。像尼尔写道。 – hakre 2012-08-14 14:09:27

回答

6

下将工作以及

$a->b

function __get('b'){ 
    $this->b = new b; 
    return $this->b; 
} 

$a->b->say('hello world')

function say('hello world'){ 
    echo 'hello world'; 
} 
4

它在A.获取的__get方法构建的是一个神奇的方法,当你尝试检索时调用属性,请参阅:documentation。 __get获取作为字符串访问的属性名称。由于该字符串用于实例化一个类,然后返回它的工作。它能做什么

class a 
{ 
    function __get($v) 
    { 
     $this->$v = new $v; 
     return $this->$v; 
    } 
} 

class b 
{ 
    function say($word){ 
     echo $word; 
    } 
} 

class c 
{ 
    function say($word){ 
     echo 'c: ' . $word; 
    } 
} 
$a = new a(); 
$a->b->say('hello world'); 

// echos 'hello world' 

$a->c->say('hello world'); 

// echos 'c: hello world' 
3

一个新的实例,但b 已经被实例化!

内部类a的魔法getter方法:

function __get($v) 
{ 
    $this->$v = new $v; 
    return $this->$v; 
} 

$v值是 'B',当你调用$a->b以后。这意味着行$this->$v = new $v;实际上被评估为等于:$this->b = new b;,然后return $this->b;

因此,要回顾一下,你吸气的通话时间评估将是这样的:

function __get($v) 
{ 
    $this->b = new b; 
    return $this->b; 
} 
1

的__get方法是一个神奇的方法。每当你试图在PHP中访问一个对象的属性,并且这个属性没有被定义时,__get方法就会以属性名称作为参数被调用。

因此,在这种情况下,你必须:

$a->b 

b不是的$一个是我们的会员,所以__get被称为用b作为参数。那么这个被运行:

function __get($v) { 
    $this->$v = new $v; 
    return $this->$v; 
} 

代b。对于$ V,让您得到:

$this->b = new b; 

这使得$ A->巴新B的情况下,你然后调用该说的成员函数。

2

$ B实际实例因为属性$ B是未定义$ a和调用$一个时 - > $ B ...它调用参数$ V = $ b中的魔术方法__get,太行

$this->$b = new $b; 

被执行。

1

在此实例:$this->$v = new $v;

细目:

创建一个目的 $一个新= A();

$b = $a->b; 

这种动态调用a::__get

function __get($v) 
{ 
    $this->$v = new $v; 
    return $this->$v; 
} 

这会返回一个b对象所以你切实做好:只要

$b->say('hello world');