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

Vik*_*han 1 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
    }
}
`
Run Code Online (Sandbox Code Playgroud)

这是一种正确的做法吗?

Jim*_*mbo 5

不要仅仅使用extends来获得额外的功能.这是一个代码味道,并暗示xmlParser 是-A adminItems,它显然不是.此外,您将来不能再次扩展,因为PHP没有多重继承.像这个例子所示,选择继承的组合.

使用依赖注入.反转对象的控制,使它们不相互依赖:请参阅控制反转.

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();
    }
}
`
Run Code Online (Sandbox Code Playgroud)

您需要在创建的类外部将它们连接在一起.你adminItems 进入xmlParser,然后根据你的需要使用它.这称为依赖注入,你可以在所有面向对象的语言中做,而不仅仅是php.

您将使用上面的对象API,如下所示:

$adminItems = new adminItems;
$xmlParser  = new xmlParser($adminItems);
$xmlParser->somName();
Run Code Online (Sandbox Code Playgroud)

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

另外,我建议您查看以下有用链接:

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