2011-05-01 93 views
1

我在这里使用PHP,我有两个类。我可以在另一个类中调用一个类的函数吗?例如:B类A类呼叫功能

 
class A 
{ 
    function a_func() 
    { 
     echo "A function"; 
    } 
} 

$a = new A(); 

class B 
{ 
    function b_func() 
    { 
     $a->a_func(); // This is the thing I'm stuck with. 
    } 
} 

我希望我在这里说清楚。我看了Google,但我不知道这是什么,所以我什么也没有提出。谢谢你的帮助。

回答

1

你有2个解决方法: 1)如果你的a_func不需要一个实例(好像是这种情况),哟ü可以使函数静态和从第二类

class A 
{ 
    public static function a_func() 
    { 
     echo "A function"; 
    } 
} 

class B 
{ 
    function b_func() 
    { 
     A::a_func(); 
    } 
} 

2)1)如果您需要a_func一个实例,你不得不创建一个叫它:

class A 
{ 
    public function a_func() 
    { 
     echo "A function"; 
    } 
} 

class B 
{ 
    function b_func() 
    { 
     $a = new A; 
     $a->a_func(); 
    } 
} 
+0

我不得不承认我对PHP类很新。如果我采用这种方法,我是否可以访问我之前设置的类A的第一个实例的变量(通过代理函数)。我问原始问题的原因是因为我有两个对象,我想从一个中获取数据,并在另一个中使用它。 – Bojangles 2011-05-01 15:39:45

+0

我已经实现了第一个解决方案,并且我提出了这个错误:'在envars.php中的对象上下文中不使用$ this,使用'echo A :: a_func(“argument”)行时;'。这里出了什么问题?我将这些函数改为'public static',但仍然是相同的错误。有任何想法吗? – Bojangles 2011-05-01 15:57:32

+0

我还应该补充说明的是:$ this-> vars [$ var]'。我真的迷失在这里,所以更多的帮助将不胜感激。 – Bojangles 2011-05-01 16:13:47

0

你可以,如果你制作$a本地b_func()

无论是

  • 声明它global $a;b_func()(可能不是一个好主意,取决于你的使用情况)

  • 传递$a作为参数传递给b_func()

    function b_func($a) 
    .... 
    
  • 制作$a的成员:

    $b = new B(); 
    $b->a = new a(); // Can be accessed by `b_func()` as `$this->a`# 
    
  • 或初始化$ab_func()

    function b_func() 
    { 
        $a = new A(); 
    

这是最好的在你的场景将依赖新生什么A和B做的,什么关系他们。

+0

感谢这Pekka。我应该在我原来的问题中说过这个,但原来的'$ a'将会保存我需要获取值的变量。我不想创建另一个空白类,但在类型为“$ a”的第一个对象中调用一个函数,该函数将获得我之前设置的值。我有道理吗? – Bojangles 2011-05-01 15:35:58

0

你可以叫a_func()如果实例A类第一:

class B 
{ 
    function b_funct() 
    { 
    $a = new A(); //create instance of A 
    $a->a_func(); //run function 
    } 
} 

一个替代方案是让a_func静:

static function a_funct() 

,并称呼其为:

A::a_function(); 
2

还不错的答案,所以远。别人还没有提到一件事......

如果B需要对象A正常工作,你应该通过一个进入构造和使用object composition

class B { 

    protected $a; 

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

    public function b_func() { 
     $this->a->a_func(); 
    } 

} 

$a = new A; 
$b = new B($a); 
$b->b_func(); 

你会看到,我已经在类B保护 财产。这是encapsulation,绝对是你应该阅读的东西。

您应该阅读的另一个重要的主题是dependency injection