2015-07-08 3 views
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. У меня было то же самое, что было реализовано в моем контроллере, и тогда он работал нормально.

ответ

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 manual для получения дополнительной информации о ключевом слове static.

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

+2

Просто добавьте к тому, что сказал rmarscher, @ Rutwick Gangurde - вы должны рассмотреть возможность расширения от StaticObject и Object, как указал rmarscher. Вы можете сделать довольно классные вещи с фильтрами в li3 (Google). Кроме того, рассмотрите использование PHP-признаков для вашего варианта использования. – Housni

+0

Спасибо rmarscher и @housni. Это была опечатка, делавшая много JavaScript в эти дни, поэтому забыла знак $. Я выполнил второй подход, создав экземпляр класса. Я прочитаю больше о ключевом слове static. –

Смежные вопросы