我在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
}
}
`
这是一种正确的做法吗?
答案 0 :(得分:5)
不要仅使用扩展来获得额外的功能。这是代码气味,暗示
xmlParser
是-aadminItems
,显然不是。此外,您将来无法再次扩展,因为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();
真的很简单。您的对象(将它们视为可重用的库)不应该依赖于除构造函数或方法注入之外的其他对象 - 因此您可以将它们替换为可测试且固有的干净代码。
另外,我建议你看一下以下有用的链接:
答案 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
中使用的方法必须是公开的。我强烈建议在A
和B
之间使用接口以获得低耦合。
答案 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();
}
}