Flo*_*osi 5 php oop inheritance method-chaining
我想我已经或多或少地设法掌握了OOP /继承,并且我认为我也理解了方法链的基础知识.但是我仍然对如何实际使用它们感到困惑.
我想做一些我以前在Magento工作时看到过的东西:在Magento中,我看到过某种用于方法链接的"选择器功能".这有点难以言喻,但它有点像:
$categoryName = Mage::getModel('catalog/category')->load($categoryId)->getName();
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
那个类的定义怎么样呢?
这可能比我预期的要简单得多或复杂得多.在任何一种情况下,非常感谢!
编辑:所以我做了一些测试,信息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;
}
}
Run Code Online (Sandbox Code Playgroud)
和运行文件:
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!
Run Code Online (Sandbox Code Playgroud)
这给了我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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试文件:
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!
Run Code Online (Sandbox Code Playgroud)
方法链接非常简单,它所做的只是使用 PHP 语法的一个特定元素:
当函数返回一个对象时,您可以直接->在该函数之后继续。
普通版本可以是:
$bar = $foo->bar();
$baz = $bar->baz();
echo $baz;
Run Code Online (Sandbox Code Playgroud)
$foo->bar()返回一个$bar具有方法的对象 () baz(),并且该方法返回某个值 ( $baz)。这可以用简写形式写成:
echo $foo->bar()->baz();
Run Code Online (Sandbox Code Playgroud)
$foo->bar()仍然返回一个具有方法的对象baz(),因此您可以直接调用它,而无需将其分配给中间变量。也许这让它更明显:
echo ( $foo->bar() )->baz();
Run Code Online (Sandbox Code Playgroud)
baz()无论返回什么,您都可以调用该方法$foo->bar()。
$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');
Run Code Online (Sandbox Code Playgroud)
因此,在上述情况下,您所需要做的就是返回一个具有setNamefrom方法的对象getPromo。我认为getPromo应该返回Promo类的某个对象。如果该类Promo有一个 method setName,那么一切就都准备好了。
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |