конструктор PHP - PullRequest
       7

конструктор PHP

1 голос
/ 01 апреля 2012

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

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

}

Но я продолжаю получать внутреннюю ошибку сервера, когда пытаюсь его запустить. Когда я закомментирую вызовы метода, он работает. Поэтому вопрос в том, могу ли я вызывать методы из конструктора или я что-то не так делаю с методами.

Ответы [ 4 ]

5 голосов
/ 01 апреля 2012

Существуют ли ваши функции getExtension, getMime и getSize? Это методы в этом классе? Если это методы, их нужно вызывать с помощью $ this -> ... как в

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

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

3 голосов
/ 01 апреля 2012

Хорошо ... этот фрагмент кода будет работать как положено:

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

Так на самом деле нужно создавать несколько объектов, которым нужен доступ к одному и тому же экземпляру соединения с БД.

0 голосов
/ 01 апреля 2012

Вы не указали явно, какую ошибку вы используете. Но попробуйте вызывать методы класса даже внутри класса, используя ключевое слово this, иначе это не сработает:

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

Лучше было бы опубликовать свой код для методов, которые вы написали. В них тоже может быть что-то не так. Возможно, забыл вернуть результат или что-то ...

0 голосов
/ 01 апреля 2012

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

Кроме того, вызовы функций, которые вы выполняете, находятся в классе или во внешних? Если они внутри класса, вам нужно назвать их так:

$this->_extension = $this->getExtension();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...