2012-03-31 6 views
1

OK. вот что я пытаюсь сделать:php oop constructor

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 ??? Какие??? У меня не возникает вопрос (или проблема с отсутствием большого количества информации). – PeeHaa

ответ

5

Существуют ли функции getExtension, getMime и getSize существуют? Являются ли они методами этого класса? Если они являются методами, они должны быть вызваны с $ это -> ... как в

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

Если они не являются методами, а также функции, вы должны убедиться, что файлы, которые содержат/определить их являются перед запуском конструктора.

+0

Они являются функциями-членами. Я забыл об этом. Теперь это работает. Спасибо за все замечательные ответы. –

0

Да, вы можете вызывать методы из конструктора. Помните, что магический метод __construct() был реализован на PHP 5. До этого вы создали функцию с именем так же, как ваш класс, который работал как ваш конструктор, поэтому в зависимости от вашей версии 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

Well ..выполняется фрагмент кода будет работать, как ожидалось:

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); 

Это на самом деле, как следует иметь дело с созданием нескольких объектов, которые все нуждаются в доступе к тому же экземпляру соединения DB.