2012-09-07 140 views
-1

我的问题是这样的(在PHP):PHP从函数返回一个对象

我有三个班,

Class cls1 { 
    public function myfunc() { 

    } 
} 
Class cls2 { 
    private $_obj1; //type of cls1 
    ... 
    public function getObj1() { 
     return $_obj1; 
    } 
} 

Class cls3 { 
    ... 
    public function getMyFunc() { 
     $temp = new cls2(); 
     $temp->getObj1()->myfunc(); //THIS IS NOT WORKING. 
     //PHP Throws an error like : Fatal error: Call to a member function getId() on a non-object in xyz.php on line 125. 
    } 
} 

我无法从CLS3经之途CLS2到达CLS1的功能。

我该如何实现它?

注意:我写了这个基本代码来显示问题。不要考虑语法错误。

+0

“这不是工作”---请详细说明这一点。如果我们不知道真正的问题,不可能帮助您 – zerkms

+2

您是否在cls2中的某处创建了cls1的实例?看起来你并没有创建它,只是返回null而不是预期的实例。 – zysoft

+0

'$ temp-> getObj1()'可能返回'null'。在'$ _obj1'(cls2) – MarcDefiant

回答

2

Object1还没有被实例化。

Class cls1 { 
    public function myfunc() { 

    } 
} 
Class cls2 { 
    private $_obj1; //type of cls1 
    ... 
    public function getObj1() { 
     if(!$this->$_obj1 instanceof cls1) { 
      $this->_obj = new cls1(); 
     } 
     return $_obj1; 
    } 
} 

Class cls3 { 
    ... 
    public function getMyFunc() { 
     $temp = new cls2(); 
     $temp->getObj1()->myfunc(); //THIS IS NOT WORKING. 
    } 
} 
2

您必须先安装$ temp对象的$ _obj1属性,然后才能检索它。例如,在cls2构造函数中执行此操作。您还需要在类中正确引用私有属性,使用this关键字引用该实例。

Class cls2 { 
    private $_obj1; //type of cls1 
    ... 
    public function __construct(){ 
     $this->_obj1 = new cls1(); 
    } 

    public function getObj1() { 
     return $this->_obj1; 
    } 
} 
+0

有什么?嗯,我认为我们找到了答案?我正在尝试它.. – totten

+1

你应该使用__construct()来创建一个构造函数(假设你试图用方法cls2()来做到这一点) –

+0

它也是这样工作的。为什么这个皱起了眉头? – Asciiom

1

这可能是一个不好的方法。为什么要在另一个班级制作班级和实例化,只需在第二班级中扩展第一班级即可。

<?php 
class cls1 { 
    public function myFunc() { 
     echo "I am myFunc!"; 
    } 
} 
class cls2 extends cls1 { 
    public function getObj1() { 
     return $obj1; 
    } 
} 
class cls3 { 
    public function getMyFunc() { 
     $temp = new cls2(); 
     $temp->myFunc(); 
    } 
} 
$a = new cls3(); 
$a->getMyFunc(); 
?>