【发布时间】:2014-01-14 11:44:31
【问题描述】:
我想我或多或少地掌握了 OOP/继承,以及我认为我理解的方法链接的基础知识。但是我仍然对如何实际使用其中一些感到困惑。
我想做一些我以前与 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: Call to a member function setName() on a non-object in /var/www/test/index.php on line 11。
但为什么? 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 method chaining?的可能重复
-
这被称为fluent interface - 所以方法将返回自我实例。从某种意义上说,这是一种反模式
-
实际上我可以看到的问题是,您应该从
getPromo方法返回PROMO实例,例如return $this->__arr[$name]; -
deceze 领先你一两分钟。你当然是完全正确的,我只是太盲目了,看不到我忘记了。 :)
标签: php oop inheritance method-chaining