2012-03-31 125 views
1

好的。這裏是我想要做的:php oop構造函數

class Image{ 

    public $_image; 
    public $_extension; 
    public $_mime; 
    public $_size; 
    public $_location; 
    public $_description; 

    public function __construct($image, $location){ 
     $this->_image = $image; 
     $this->_location = $location; 
     $this->_extension = getExtension(); 
     $this->_mime = getMime(); 
     $this->_size = getSize(); 
    } 

    private functions fallow..... 

} 

但我不斷收到內部服務器錯誤,當我嘗試運行它。當我註釋掉方法調用它的作品。所以問題是我可以從構造函數中調用方法,還是我在方法上做了錯誤的操作。

+0

你應該學會檢查你的錯誤日誌。 500內部服務器錯誤是沒有意義的沒有您有權訪問的日誌的上下文。檢查你的PHP.ini的記錄位置。通常情況下,日誌記錄未啓用。你應該啓用它。 – Brad 2012-03-31 23:55:11

+0

調用方法是好的(但你可以通過一個簡單的例子驗證這個)。 – 2012-03-31 23:55:19

+0

呃???什麼???我沒有得到這個問題(或者錯過很多信息)。 – PeeHaa 2012-03-31 23:56:09

回答

5

你的函數getExtension,getMime和getSize是否存在?他們是這個班的方法嗎?如果他們的方法,他們需要與$這個被稱爲 - > ...在

$this->_extension = $this->getExtension(); 

如果不是方法,並且功能,你需要確保定義包含/文件他們都在運行構造函數之前加載。

+0

他們是會員功能。我忘了這個。現在它可以工作。感謝所有偉大的迴應。 – 2012-04-01 00:11:51

0

是的,你可以從構造函數中調用方法。請記住,在PHP 5中實現了__construct()魔術方法。在此之前,您創建了一個名稱與您的類相同的函數,該函數充當您的構造函數,這取決於您的PHP版本,這可能是一個問題。

此外,函數調用你正在做,他們在類或外部?如果他們在課堂上,則需要用這種方式給他們打電話:

$this->_extension = $this->getExtension(); 
0

您沒有指定明確顯示的錯誤。但是,嘗試打電話給你甚至使用this關鍵字類內部類的方法,否則便無法正常工作:

public function __construct($image, $location) 
{ 
    $this->_image = $image; 
    $this->_location = $location; 
    $this->_extension = $this->getExtension(); 
    $this->_mime = $this->getMime(); 
    $this->_size = $this->getSize(); 
} 

會是一個更好的主意,發佈您的代碼爲你寫的方法。他們內部也可能有問題。也許忘記返回結果或東西...如預期

3

好..this的代碼段將工作:

class Foo 
{ 
    protected $secret = null; 
    public function __construct($data) 
    { 
     $this->secret = $this->makeSecret($data); 
    } 

    public function makeSecret($data) 
    { 
     return md5($data); 
    } 
} 

$bar = new Foo('lorem ipsum'); 

這是沒有問題的。

但是你應該知道,這被認爲是一種不好的做法 - 在構造函數中進行計算/工作。它使得這個類幾乎不可測試。相反,如果需要在將對象「釋放」到代碼的其餘部分之前執行一些計算,則應該使用工廠。沿着線的東西:

class ImageFactory 
{ 
    public function build($image, $location) 
    { 
     $instance = new Image($image, $location); 
     $instance->prepare(); 
     return $instance; 
    } 
} 

類將需要一些變化:

class Image 
{ 

    protected $_image; // you were leaking abstraction 
    protected $_extension; 
    protected $_mime; 
    protected $_size; 
    protected $_location; 
    protected $_description; 

    public function __construct($image, $location) 
    { 
     $this->_image = $image; 
     $this->_location = $location; 
    } 

    public function prepare() 
    { 
     $this->_extension = $this->getExtension(); 
     $this->_mime = $this->getMime(); 
     $this->_size = $this->getSize(); 
    } 

    private functions fallow..... 

} 

現在,當您需要創建新的對象,你這樣做:

$factory = new ImageFactory; 
$image = $factory->build($file, '/uploads/'); 

當然實例ImageFactory可以重複使用,並且如果所有圖像使用相同的$location,那麼您將在初始化時將該變量傳遞給工廠。而工廠將能夠「記得」,並通過它創建的所有圖像:

$factory = new ImageFactory('/uploads/'); 
$img1 = $factory->build($file); 
$img2 = $factory->build($something_else); 

這實際上是一個應該如何處理創建多個對象,這都需要訪問同一個數據庫連接實例。