php - 方法链和类继承

标签 php oop inheritance method-chaining

我想我或多或少地掌握了 OOP/Inheritance,我想我也理解了方法链的基础知识。但是我仍然对如何实际使用其中的一些内容感到困惑。

我想做一些我之前在使用 Magento 时看到的东西: 在 Magento 中,我看到了方法链中使用的某种“选择器函数”。这有点难以用语言表达,但大致是这样的:

$categoryName = Mage::getModel('catalog/category')->load($categoryId)->getName();

我感兴趣的是 load($categoryId) 部分,因为它是一个函数,它选择某个实例并允许我在该特定实例上运行一个函数。

现在,我正在编写一个模块,允许我在我们的网站上配置某些促销事件。鉴于我们将有许多不同的促销事件,并且我希望它们易于配置和修改,所以我想做类似的事情。

所以,如果我想能够做这样的事情:

$prm = new Promotion();

$prm->addPromo('xmasPromo');
$prm->addPromo('nyPromo');

$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');
$prm->getPromo('nyPromo')->setName('Promotion for New Years!');

echo $prm->getPromo('xmasPromo')->getName(); // returns: Promotion for Xmas!
echo $prm->getPromo('nyPromo')->getName(); // returns: Promotion for New Years!

它的类定义应该是什么样的?

这可能比我预期的要简单或复杂得多。无论哪种情况,都非常感谢!


编辑: 所以我用 deceze 给我的信息做了一些测试,但我仍然很困惑。 糟糕的命名并将 2 个类放在 1 个文件中,这就是我所做的:

类文件:

class Promotion {
    private $__arr = array();
    public function addPromo($name) {
        $this->__arr[$name] = new Promo();
    }
    public function getPromo($name) {
        $this->__arr[$name];
    }
}

class Promo {
    private $name;
    public function setName($name) {
        $this->name = $name;
    }
    public function getName() {
        return $name;
    }
}

和运行文件:

require_once 'class.php';
error_reporting(E_ALL);

$prm = new Promotion();

$prm->addPromo('xmasPromo');
$prm->addPromo('nyPromo');

$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');
$prm->getPromo('nyPromo')->setName('Promotion for New Years!');

echo 'X: '.$prm->getPromo('xmasPromo')->getName(); // returns: Promotion for Xmas!
echo "\n";
echo 'N: '.$prm->getPromo('nyPromo')->getName(); // returns: Promotion for New Years!

这给我 fatal error :在第 11 行/var/www/test/index.php 中的非对象上调用成员函数 setName()。 但为什么? getPromo() 不应该把对象还给我吗? 再次感谢..


感谢这里的好人,它现在可以工作了。如果有人带着相同或相似的问题路过这里,这里是最终的工作代码:

类:

class Promotion {
    private $__arr = array();
    public function addPromo($name) {
        $this->__arr[$name] = new Promo();
    }
    public function getPromo($name) {
        return $this->__arr[$name];
    }
}

class Promo {
    private $name;
    public function setName($name) {
        $this->name = $name;
    }
    public function getName() {
        return $this->name;
    }
}

测试文件:

require_once 'class.php';
error_reporting(E_ALL);

$prm = new Promotion();

$prm->addPromo('xmasPromo');
$prm->addPromo('nyPromo');

$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');
$prm->getPromo('nyPromo')->setName('Promotion for New Years!');

echo 'X: '.$prm->getPromo('xmasPromo')->getName(); // returns: Promotion for Xmas!
echo "\n";
echo 'N: '.$prm->getPromo('nyPromo')->getName(); // returns: Promotion for New Years!

最佳答案

方法链接非常简单,它所做的只是使用 PHP 语法的一个特定元素:

当一个函数返回一个对象时,您可以直接在该函数之后继续->

普通版可以是:

$bar = $foo->bar();
$baz = $bar->baz();
echo $baz;

$foo->bar() 返回一个对象 ($bar),它有一个方法 baz(),该方法返回一些值 ($baz)。这可以像这样简写:

echo $foo->bar()->baz();

$foo->bar() 仍然返回一个对象,该对象有一个方法 baz(),因此您可以直接调用它而无需将其分配给中间变量。也许这使它更明显:

echo ( $foo->bar() )->baz();

无论 $foo->bar() 返回什么,您都将调用 baz() 方法。

$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');

因此,在上述情况下,您需要做的就是从 getPromo 返回一个具有方法 setName 的对象。我假设 getPromo 应该返回一些对象,比如 Promo 类。如果 Promo 类有一个方法 setName,那么一切就绪。

关于php - 方法链和类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112737/

相关文章:

java - 返回带有参数 List<S1>、List<S2> 的 List<T> 的方法,其中 S1 和 S2 扩展 T

php - 如何在wordpress中制作可见菜单

php - 如何将 SQL 表中字段的内容用作 HTML

c# - 在 C# 中实现组合和聚合?

c - 为 Cocoa(touch) 开发创建自己的库的指南

java - 为什么下面的代码可以编译运行成功?

php - 我怎样才能从这个数组 (stdClass) php 中获取数据?

php - 如何插入一个表并更新另一个表的计数

java - 如何在 java netbeans 中保存包含组合框和文本框的 jpanel?

C++ 继承父 "knowing"的 child