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