2013-01-09 100 views
0

我有一個自動加載器,在加載一個小型框架時初始化很多對象。對象保存爲靜態變量,但現在我遇到了一個問題。我有一個在自動加載器中實例化的文件,但稍後會用到類似異常處理程序的文件,在調用特殊情況時會照顧它。目的是這個類中的方法返回$ this這個類對象,但是當這樣做時,返回的值不是被調用對象的實例,而是被繼承到調用它的類中。此外,被調用的exception_handler不僅是它自己的一個實例,而且在整個自動加載器中都會實例化,並在所有內容都被加載時繼承$ this。混亂,但我已經建立了一個小例子:返回當前沒有繼承屬性的類對象

class a { 
    public $a_tmp = 'tmp'; 
} 

class b extends a { 
    public $b_tmp = 'tmp'; 

    public function getOnlyThisClass() { 
     return $this; 
    } 
} 

$b = new b(); 
$b->getOnlyThisClass(); 

這將返回:

object(b)#1 (2) { 
    ["b_tmp"]=> 
    string(3) "tmp" 
    ["a_tmp"]=> 
    string(3) "tmp" 
} 

,我需要它只返回調用的類時被稱爲特殊方法。我知道這可以用工廠模式解決,但是在這種情況下想避免它。

謝謝。

+0

爲什麼不讓'$ a_tmp'私人? –

+0

這是發生了什麼事情的一個小例子,使得$ a_tmp私有意味着我應該讓整個框架中的所有內容因爲一個類而變得私有。也許我錯了,但工廠模式更具吸引力。 :) –

+0

我不知道我是否理解問題,如果你這樣做:new b()這將返回一個b的實例,繼承一些方法和屬性。但是當你調用getOnlyThisClass時,你需要b的實例而不使用inerthed方法和屬性? – FerCa

回答

0

嘗試使用反射不繼承屬性獲取類對象的屬性:

<?php 

class a { 
    public $a_tmp = 'tmp'; 
} 

class b extends a { 
    public $b_tmp = 'tmp'; 

    public function getOnlyThisClass() { 
     $cl  = new stdClass(); 
     $refclass = new ReflectionClass($this); 
     foreach ($refclass->getProperties() as $property) 
     { 
      $name = $property->name; 
      if ($property->class == $refclass->name) { 
       $cc = $property->name; 
       $cl->$cc = $this->$name; 
      } 
     } 
     return $cl; 
    } 
} 
$b = new b(); 
var_dump($b->getOnlyThisClass()); 

輸出:

object(stdClass)#2 (1) { ["b_tmp"]=> string(3) "tmp" } 

您可以創建一個stdClass的,有分配發現性能..做完這個以符合您的需要。

+0

偉大的例子,但不能真正看到這將如何工作,類b需要返回自己作爲一個對象,它本身的一個實例。在我的應用程序中有$ b中的方法,一旦它被調用並存儲在一個變量中,我需要訪問這些方法。你的返回字符串,我可以驗證agianst。在我的應用程序深入下去,我需要這個來驗證「$ tmp instanceof b」。 –

+0

我以爲你需要它只是爲了調試..聽起來像是不可能將它從父母的課堂中分離出來,並仍然是自己。 –

+0

我認爲你是對的,單身工廠模式是我的解決方案。謝謝你的幫助! –

相關問題