如何在当前类中使用另一个类的函数

时间:2014-12-10 12:41:20

标签: php oop

我在adminItems内有一个名为adminitems.class.php的班级。我想在xmlParser::someName()中的xmlParser.class.php中包含此类的一项功能。

像这样:

require_once("adminitems.class.php");
$obj = new adminitems();

class xmlParser
{
    function someName()
    {
        $obj->addAds(); // addAds is within adminItems object
    }
}
`

这是一种正确的做法吗?

4 个答案:

答案 0 :(得分:5)

  

不要仅使用扩展来获得额外的功能。这是代码气味,暗示xmlParser 是-a adminItems,显然不是。此外,您将来无法再次扩展,因为PHP没有多重继承。选择此示例所示的composition over inheritance

使用依赖注入。颠倒对象的控制权,使他们彼此不依赖:见Inversion on Control

class xmlParser
{
    /**
     * @var adminItems
     */
    protected $adminItems;

    /**
     * @constructor
     * 
     * @param adminItems $adminItems
     */
    public function __construct(adminItems $adminItems)
    {
        $this->adminItems = $adminItems;
    }

    /**
     * Whatever this does...
     */
    function someName()
    {
        $this->adminItems->addAds();
    }
}
`

您需要在您创建的类的外部,将它们连接在一起。您将adminItems 传递到 xmlParser,然后根据需要使用它。这被称为Dependency Injection,你可以在所有面向对象的语言中做,而不仅仅是php。

您将使用上述对象API:

$adminItems = new adminItems;
$xmlParser  = new xmlParser($adminItems);
$xmlParser->somName();

真的很简单。您的对象(将它们视为可重用的库)不应该依赖于除构造函数或方法注入之外的其他对象 - 因此您可以将它们替换为可测试且固有的干净代码。

另外,我建议你看一下以下有用的链接:

  • PSR-2用于命名约定:
    • 使用XmlParser代替xmlParser作为您的班级名称
  • PSR-4进行自动加载:
    • 了解如何使用composer为您生成自动加载文件
    • 了解您的文件如何与目录结构进行1:1映射
    • 了解您只需在项目中使用一次

答案 1 :(得分:2)

如果类B需要类A的函数,那么PHP中有许多解决方案:

<强> 1。继承

使用班级A扩展班级B。类B将能够访问类A的公共和受保护方法。

class B extends A {
}

我不推荐这个。在OOP中使用继承只是为了使用具有相同责任性的类的一个函数,这是一个非常糟糕的做法。

<强> 2。性状

使用traits(自PHP5.4.0起):

trait factoredMethods {
    function getX() { /*...*/ }
    function setY() { /*...*/ }
}

class A {
    use factoredMethods;
}

class B {
    use factoredMethods;
}

在某些情况下,这可能是一个有趣的解决方案,但它往往是一个错误概念的补丁。

第3。组合物

最好的选择是使用构图。 B使用A

class A {
}

class B {
    private $a;

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

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

当然,您要在A中使用的方法必须是公开的。我强烈建议在AB之间使用接口以获得低耦合。

答案 2 :(得分:-5)

几乎是正确的方法 - 但$ obj不在范围内。一个丑陋的解决方案是在全球范围内对其进行检查......

require_once("adminitems.class.php");
global $obj;
$obj = new adminitems();

class xmlParser
{

function someName()
{
   global $obj;
   $obj->addAds();

}

您可以使用命名空间来改进此方法,但正确的答案可能是将引用传递给范围,例如。

function someName($obj)
{
   $obj->addAds();

}

答案 3 :(得分:-5)

您可以通过扩展父类

来使用其他类功能
class xmlParser extends adminitems{ 
    function someName(){ 
       $obj->addAds(); 
 } 
}