Хорошо ... этот фрагмент кода будет работать как положено:
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 );
Так на самом деле нужно создавать несколько объектов, которым нужен доступ к одному и тому же экземпляру соединения с БД.