Реализовывать свои собственные служебные функции в Lithium?

1

Я новичок в литий-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');
    }
}

?>

Правильно ли это? Должен ли мой класс полезности расширять что-то? Или литий обеспечивает какой-то другой способ достичь этого?

Более того, я не могу получить доступ к защищенной переменной $_items в моем методе getItems. У меня было то же самое, что было реализовано в моем контроллере, и тогда он работал нормально.

Теги:
model-view-controller
oop
web
lithium

1 ответ

4
Лучший ответ

Это прекрасный способ сделать это. Есть два основных литиевых класса, которые вы можете расширить: \ 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 для получения дополнительной информации о ключевом слове static.

Еще одна небольшая заметка: вам не нужна ведущая обратная косая черта в вашем заявлении о use.

  • 2
    Просто чтобы добавить к тому, что сказал rmarscher, @Rutwick Gangurde - вы должны рассмотреть возможность расширения от StaticObject и Object, как указал rmarscher. Вы можете делать довольно интересные вещи с фильтрами в li3 (Google, что). Также рассмотрите возможность использования PHP Traits для вашего случая использования.
  • 0
    Спасибо rmarscher и @housni. Это была опечатка, в наши дни я делал много JavaScript, поэтому забыл знак $. Я следовал второму подходу, создавая экземпляр класса. Я буду читать больше на статическое ключевое слово.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню