在Lithium中实现我自己的实用程序功能?

时间:2015-07-08 10:23:04

标签: php oop model-view-controller web lithium

我是Lithium PHP的新手,了解锂的基础知识。我想实现自己的Utility函数。我创建了与utilities平行的app\controllers文件夹。这就是我班级的样子:

<?php

namespace app\utilities;

class UtilityFunctions {
    protected $_items = array(
            'a' => 'Apple',
            'b' => 'Ball',
            'c' => 'Cat'
        );

    //I get _items as undefined here, blame my poor OOP skills.
    public function getItem(alphabet) {
        return $this->_items[alphabet];
    }
}

?>

我在我的控制器中使用它:

<?php

namespace app\controllers;

use \app\utilities\UtilityFunctions;

class MyController extends \lithium\action\Controller {
    public function index() {
        $args = func_get_args();
        $item = UtilityFunctions::getItem($args[0]);

        return compact('item');
    }
}

?>

这是正确的方法吗?我的实用程序类需要扩展一些东西吗?或者Lithium是否提供了其他方法来实现这一目标?

此外,我无法在$_items方法中访问受保护的变量getItems。我在控制器中实现了相同的功能,然后它工作正常。

1 个答案:

答案 0 :(得分:4)

这是一个很好的方法。您可以扩展两个核心Lithium类:\lithium\core\Object\lithium\core\StaticObject

我认为这对您的用例没有必要。

您无法访问受保护变量的原因是您静态调用该方法。您应该重写您的类以使用静态变量和方法。另外,我认为它只是一个拼写错误,为StackOverflow创建了一个示例,但您忘记了$方法中alphabet var的getItem

<?php

namespace app\utilities;

class UtilityFunctions {
    protected static $_items = array(
        'a' => 'Apple',
        'b' => 'Ball',
        'c' => 'Cat'
    );

    public static function getItem($alphabet) {
        return static::_items[$alphabet];
    }
}

?>

另一个选择是不更改UtilityFunctions类,而是在控制器中实例化该类:

<?php

namespace app\controllers;

use app\utilities\UtilityFunctions;

class MyController extends \lithium\action\Controller {
    public function index() {
        $args = func_get_args();
        $utilities = new UtilityFunctions();
        $item = $utilities->getItem($args[0]);

        return compact('item');
    }
}

?>

对于像这样的简单情况,类不需要保持任何状态,我建议使用静态方法。有关静态关键字的更多信息,请查看php manual

另一个小注意事项,您不需要use声明中的反斜杠。