fragment ..ce bien du code fonctionne comme prévu:
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');
Ce n'est pas un problème.
Mais vous devriez savoir, cela est considéré comme une mauvaise pratique - faire du calcul/travail dans le constructeur. Cela rend cette classe pratiquement impossible à tester. Au lieu de cela, si vous devez effectuer un calcul avant de "libérer" l'objet au reste du code, vous devez utiliser une fabrique. Quelque chose le long des lignes de:
class ImageFactory
{
public function build($image, $location)
{
$instance = new Image($image, $location);
$instance->prepare();
return $instance;
}
}
La classe aurait besoin de quelques changements:
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.....
}
Maintenant, quand vous devez créer un nouvel objet que vous faites:
$factory = new ImageFactory;
$image = $factory->build($file, '/uploads/');
Bien sûr, l'instance de ImageFactory peut être réutilisable, et si toutes vos images utilisent le même $location
, alors vous passeriez cette variable à l'usine lors de l'initialisation. Et l'usine serait en mesure de « souvenir » et passer à toutes les images qu'il crée:
$factory = new ImageFactory('/uploads/');
$img1 = $factory->build($file);
$img2 = $factory->build($something_else);
Ceci est en fait la façon dont on doit faire face à la création d'objets multiples, qui ont tous besoin d'un accès à une même instance de connexion DB.
Vous devriez apprendre à vérifier vos journaux d'erreurs. 500 Erreur de serveur interne est sans signification sans contexte à partir des journaux auxquels vous avez accès. Vérifiez votre fichier PHP.ini pour l'emplacement de journalisation. Souvent, la journalisation n'est pas activée. Vous devriez l'activer. – Brad
méthodes d'appel est très bien (mais vous auriez pu vérifié cela avec un exemple simple ..) –
Huh ??? Quelle??? Je ne comprends pas la question (ou le manque de beaucoup d'infos). – PeeHaa