2011-08-18 83 views
2

可能重复:
Call function of class ONE from class TWO without extend?访问功能使用类对象的

为什么不起作用?

class A { 
     function one() { 
      echo "Class A"; 
     } 
    } 

    class B { 
     function two() { 
      echo "Class B"; 
      $a->one(); 
     } 
    } 


    $a = new A; 
    $b = new B; 

    $b->two(); 
+0

标题应该是:“它为什么要工作?” - 也许错误报告有帮助,你应该得到一个致命的错误。 – hakre

+1

查找[变量范围](http://php.net/manual/en/language.variables.scope.php) – Phil

回答

0

$a在您的示例中无法访问Class B。请阅读Variable Scope

尝试:

class A { 
    public function one() { 
     echo "Class A"; 
    } 
} 

class B { 
    public function two() { 
     echo "Class B"; 
     $a = new A; 
     $a->one(); 
    } 
} 

$b = new B; 
$b->two(); 
0

这不起作用,因为$a不是一个全局变量。 如果您事先声明$a为全球B类,它应该可以工作。

class B { 
     function two() { 
      global $a; 
      echo "Class B"; 
      $a->one(); 
     } 
    } 
+2

虽然这在技术上可行,但这是一件可怕的事情。最好将'$ a'作为依赖关系传递给'B' – Phil

+0

我刚刚回答了这个问题。但是你是对的,如果可能的话应该避免这样的事情。 – Karsten

0

如上所述,这是一个可变范围问题。 B::two()的范围不包括已在全局名称空间中声明的变量$a

要做的最好的事情是将$a改为B作为依赖项。将会有几种方法可以做到这一点...

一次性使用的B::two()

public function two(A $a) 
{ 
    echo 'Class B'; 
    $a->one(); 
} 

然后

$b->two($a); 

由于B

class B 
{ 
    private $a; 

    public function __construct(A $a) 
    { 
     $this->a = $a; 
    } 

    public function two() 
    { 
     echo 'Class B'; 
     $this->a->one(); 
    } 
} 

属性然后

$b = new B($a); 
$b->two();