2012-03-31 6 views
1

OK。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

+0

メソッドを呼び出すのはうまくいきます(ただし、単純な例でこれを確認できました)。 –

+0

Huh ???何???私は質問(またはprobの情報がたくさんありません)を取得しません。 – PeeHaa

答えて

5

関数getExtension、getMime、およびgetSizeは存在しますか?このクラスのメソッドですか?彼らは方法であれば、彼らは$これで呼び出される必要がある - > ...彼らは方法はありませんし、機能している場合

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

に、あなたは/格納したファイルは、それらがされている定義を確認する必要があるとして、コンストラクタを実行する前にロードされます。

+0

メンバー関数です。私はこれを忘れていました。今それは動作します。すべての素晴らしい応答に感謝します。 –

0

はい、コンストラクタ内からメソッドを呼び出すことができます。 __construct()のマジックメソッドはPHP 5で実装されていたことを覚えておいてください。その前に、あなたのクラスと同じ名前の関数を作成しました。これはあなたのPHPバージョンに応じてコンストラクタとして機能します。

さらに、この関数はあなたが作成しているか、それらがクラスにあるのか、外部にありますか?

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

あなたがはっきりexpiriencingているものにエラーあなたが指定したdidntの:彼らはクラス内にある場合は、この方法でそれらを呼び出す必要があります。しかし、それ以外の場合は動作しないでしょう、あなたにも、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'); 

を。

しかし、コンストラクタで計算/作業を行うことは悪い習慣と考えられます。それはそのクラスを事実上テストすることができません。代わりに、オブジェクトをコードの残りの部分に「解放」する前にある計算を実行する必要がある場合は、ファクトリを使用する必要があります。線に沿って何か:もちろん

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

のインスタンスを:あなたはあなたが新しいオブジェクトを作成する必要がある場合に今

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..... 

} 

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

クラスはいくつかの変更が必要になりますImageFactoryは再利用可能で、すべての画像が同じ$locationを使用している場合は、その変数を初期化時にファクトリに渡します。そして、工場は「それを覚えている」と、それが作成するすべての画像に渡すことができるようになります:

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

これは、1つはすべて同じDB接続インスタンスへのアクセスを必要とする複数のオブジェクトを作成して対処すべきか、実際にあります。