[英]Could Wordpress have lazy-loading queries? Or is it limitation of PHP?
[英]php: Class lazy-loading?
我有一個問題,這是我過去幾天一直在考慮的問題。 在php應用程序中,您需要執行以下操作:
想象一下,一個Web應用程序有數百個類,這些類可能需要或可能不需要這個特定的頁面加載,但只能在應用程序的開頭定義。 我想要的解決方案就是運行
$obj->calculate('price');
沒有創建對象,例如像這樣
mathclass::calculate('price');
然后根據需要自動加載數學類而不需要主要開銷,這里的問題是我不能再在數學類中給出任何變量
($var1,$var2).
我想要的是能夠偽造對象而不需要對類發生任何自動加載,因為不添加開銷,但是對象用變量創建自己,但只有當我真的需要用它做什么時。
我的意思是php真的希望我在開始時定義每個類,以便我以后可以使用它們嗎? 這是懶人裝嗎? 急切加載?
我可能會解釋這個問題,所以請指出我正確的方向。
class Service {
private $cb, $instance;
public function __construct($cb){
$this->cb = $cb;
}
public function __invoke() {
if(!$this->instance){
$this->instance = call_user_func($this->cb);
}
return $this->instance;
}
}
// setup autoloading
set_include_path(__DIR__.'/vendor'. PATH_SEPARATOR .get_include_path()); // optional
spl_autoload_register(function($c){
include preg_replace('#\\\|_(?!.+\\\)#','/',$c).'.php';
});
// simple dependency injection
$service['db'] = new Service(function(){
return new Database('sqlite::filename.sqlite');
});
$service['config'] = function() use(&$service){
return new Config($service['db']());
};
$service['math'] = function() use(&$service){
return new Math($service['config']());
};
// usage
$service['math']()->calculate('price');
使用依賴注入框架 。 它允許您從配置文件配置類,當您需要類時,只需通過服務構建器調用它。
您可以使用延遲加載工廠,即
class Registry
{
private $registeredClasses;
private $loadedClasses;
private $objects;
public function RegisterClass($className, array $parameters)
{
// ... store class ...
}
private function Load($className)
{
// Load the class via some sort of autoloader
}
private function CreateInstance($className)
{
$parameters = $this->GetParametersFor($className);
$this->CreateNewInstanceWithParameters($className, $parameters);
}
public function GetObject($className)
{
if (!$this->IsAvailable($className))
{
$this->Load($className);
$this->CreateInstance($className);
}
return $this->GetInstanceOf($className);
}
}
稍后在您的代碼中,您可以像這樣使用它:
$registry = new Registry();
$registry->RegisterClass("math", array("var1" => $var1, "var2" => $var2));
...
$registry->GetObject("math")->calculate($x1, $x2);
...
你需要添加我懶得添加的部分,即自動加載。
如果使用自動加載功能,它只會在實例化時加載數學類,1選項是在需要時實例化它,另一種選擇是使用某種包含並調用類的包裝類。
您可以使用的是PHP中的靜態類。 雖然這可能是您認為不適用於高流量網站的內容。
聲明一個這樣的類:
class Something
{
private static $var = "something";
public static function PrintVar()
{
echo self::$var;
}
}
現在,您可以包含此類並在任何您喜歡的位置執行代碼,而無需初始化對象。
像這樣:
Something::PrintVar();
版畫
something
祝好運!
類對象需要使用new()
進行定義的部分原因是因為它們占用了內存。 通常情況下,如果你沒有這樣做,PHP將在腳本結束時執行內存清理,但通常在構造函數/析構函數面向對象的環境中,你需要unset()
該類對象以釋放內存。 早期版本的PHP(在php4之前)由於這些原因而出現內存泄漏問題。
如果你想避免整個初始化過程,你可能只想嘗試一個簡單的包含庫,例如:
<?
if (!function_exists("calculate"))
{
function calculate($var1={default},$var2={default})
{
...routine...
}
}
?>
然后,您不必處理為簡單例程定義完整類的全部痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.