簡體   English   中英

php:類懶惰加載?

[英]php: Class lazy-loading?

我有一個問題,這是我過去幾天一直在考慮的問題。 在php應用程序中,您需要執行以下操作:

  1. 定義它
  2. 像這樣運行一個函數:(使用自動加載和注冊表對象)
  3. $ registry-> obj = new mathClass($ var1,$ var2); //創建對象,其中$ var1保存數據庫對象,$ var2保存值1
  4. $登記處送交> obj->計算( '值'); //獲取產品行並返回其總值。 這樣在腳本中的任何時候我都可以簡單地運行我事先定義的計算函數(或其他一些函數)。

想象一下,一個Web應用程序有數百個類,這些類可能需要或可能不需要這個特定的頁面加載,但只能在應用程序的開頭定義。 我想要的解決方案就是運行

$obj->calculate('price'); 

沒有創建對象,例如像這樣

mathclass::calculate('price'); 

然后根據需要自動加載數學類而不需要主要開銷,這里的問題是我不能再在數學類中給出任何變量

($var1,$var2).

我想要的是能夠偽造對象而不需要對類發生任何自動加載,因為不添加開銷,但是對象用變量創建自己,但只有當我真的需要用它做什么時。

我的意思是php真的希望我在開始時定義每個類,以便我以后可以使用它們嗎? 這是懶人裝嗎? 急切加載?

我可能會解釋這個問題,所以請指出我正確的方向。

編輯2015:簡單的偽代碼示例解決方案:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM