在 Lithium 中实现我自己的效用函数?
Implementing my own utility functions in Lithium?
我是 Lithium 的新手 PHP 并且了解 Lithium 的基础知识。我想实现自己的 Utility
功能。我创建了与 app\controllers
并行的 utilities
文件夹。这就是我的 class 的样子:
<?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');
}
}
?>
这样做正确吗?我的实用程序 class 是否需要扩展某些内容?或者 Lithium 是否提供了一些其他方法来实现这一点?
此外,我无法在我的 getItems
方法中访问受保护的变量 $_items
。我在我的控制器中实现了同样的东西,然后它运行良好。
这是一个很好的方法。您可以从两个核心 Lithium class 扩展:\lithium\core\Object and \lithium\core\StaticObject
我认为您的用例没有必要。
您无法访问受保护变量的原因是因为您正在静态调用该方法。您可能应该重写 class 以使用静态变量和方法。另外,我认为这只是为 Whosebug 创建示例的错字,但您忘记了 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 class,而是在控制器中实例化 class:
<?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');
}
}
?>
对于像这样 class 不需要保持任何状态的简单情况,我建议使用静态方法。查看 php manual 以获取有关 static 关键字的更多信息。
另一个小提示,您的 use
语句中不需要前导反斜杠。
我是 Lithium 的新手 PHP 并且了解 Lithium 的基础知识。我想实现自己的 Utility
功能。我创建了与 app\controllers
并行的 utilities
文件夹。这就是我的 class 的样子:
<?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');
}
}
?>
这样做正确吗?我的实用程序 class 是否需要扩展某些内容?或者 Lithium 是否提供了一些其他方法来实现这一点?
此外,我无法在我的 getItems
方法中访问受保护的变量 $_items
。我在我的控制器中实现了同样的东西,然后它运行良好。
这是一个很好的方法。您可以从两个核心 Lithium class 扩展:\lithium\core\Object and \lithium\core\StaticObject
我认为您的用例没有必要。
您无法访问受保护变量的原因是因为您正在静态调用该方法。您可能应该重写 class 以使用静态变量和方法。另外,我认为这只是为 Whosebug 创建示例的错字,但您忘记了 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 class,而是在控制器中实例化 class:
<?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');
}
}
?>
对于像这样 class 不需要保持任何状态的简单情况,我建议使用静态方法。查看 php manual 以获取有关 static 关键字的更多信息。
另一个小提示,您的 use
语句中不需要前导反斜杠。