【问题标题】:Implementing my own utility functions in Lithium?在锂中实现我自己的实用功能?
【发布时间】:2015-07-08 10:23:04
【问题描述】:

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

<?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 是否提供了其他方式来实现这一点?

此外,我无法在我的 getItems 方法中访问受保护的变量 $_items。我在我的控制器中实现了同样的东西,然后它工作得很好。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    <?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,了解有关 static 关键字的更多信息。

    另一个小提示,您的use 语句中不需要前导反斜杠。

    【讨论】:

    • 只是为了补充 rmarscher 所说的,@Rutwick Gangurde - 您应该考虑从 StaticObject 和 Object 扩展,正如 rmarscher 指出的那样。您可以使用 li3 中的过滤器(Google that)做一些非常酷的事情。此外,请考虑将 PHP Traits 用于您的用例。
    • 感谢 rmarscher 和 @housni。这是一个错字,这些天做了很多 JavaScript,因此忘记了 $ 符号。我通过实例化类来遵循第二种方法。我将阅读更多关于静态关键字的内容。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多