Est-il possible de connaître le nom de l'instance d'une classe depuis celle-ci ?
Un exemple basique :
Code : Tout sélectionner
class A{
}
$truc=new A();Code : Tout sélectionner
class A{
}
$truc=new A();Comme ca tu veux dire?Bonjour,
Est-il possible de connaître le nom de l'instance d'une classe depuis celle-ci ?
Un exemple basique :Je cherche à avoir une fonction (ou une méthode à définir dans la classe) à utiliser dans la classe A du genre get_instance_name($this) qui me renverrait 'truc' dans l'exemple ci-dessus.Code : Tout sélectionner
class A{ } $truc=new A();
$className = get_class($instance);
@+ Non, je ne sais même pas ce que c'est. :/EDIT: As-tu pensé au pattern Singleton?
Le Singleton permet d'avoir une instance unique:Non, je ne sais même pas ce que c'est. :/EDIT: As-tu pensé au pattern Singleton?
<?php
class Toto
{
/**
* Variable de class pour l'instance
*
* @var, instance
*/
private static $_instance = NULL;
/**
* Constructeur privé, empèche une instanciation externe
*
* @value : none
* @return : none
*/
private function __construct()
{
}
/**
* Empêche le clonage
*
* @value : none
* @return : none
*/
private function __clone()
{
}
/**
* Récupère l'instance de class
* Si elle n'éxsiste pas on la créé
*
* @value : none
* @return : none
*/
public static function getInstance()
{
if (!isset(self::$_instance)) self::$_instance = new self();
return self::$_instance;
}
}
?>
Si tu as besoin de plusieurs Instances de même class c'est un peu différent mais très faisableCode : Tout sélectionner
class projet{
function __construct($idprojet){
$this->photo_avant=new photo(getTableFromDB('categ=av&projet='.$idprojet));
$this->photo_apres=new photo(getTableFromDB('categ=ap&projet='.$idprojet));
}
}
class photo{
function __construct($table){
// du code
}
function __toString(){
return '<input type="text" name="'.get_instance_name($this).'" value="'.$this->fichierphoto.'"/>';
}
}
$monprojet=new projet(4);
echo $monprojet->photo_avant;
echo $monprojet->photo_apres;Code : Tout sélectionner
foreach($_POST as $key => $value) $monprojet->$key=$value;Ca permet d'avoir qu'une Instance... L'intéret est multiple. Le plus classique est l'accès aux DB.Ouh là, ça se complique. :/
Je manipule plusieurs classes, en fait. En simplifiant le plus possible, j'ai quelque chose dans ce goût-là :
[...]
Dans ma première classe, j'utilise une fonction qui va récupérer des infos dans une base de données selon différents critères (pour simplifier, on va dire qu'elles sont récupérées sous forme d'un tableau) et je crée plusieurs instances d'une seconde classe (photo) pour gérer mes diverses photos.
Dans la classe photo, je voudrais pouvoir récupérer le nom de l'instance pour l'utiliser dans la méthode magique __toString afin de créer un champ de formulaire.
Le but est d'obtenir, après validation du formulaire, les variables $_POST avec les bons noms (dans cet exemple $_POST['photo_avant'] et $_POST['photo_apres']) pour pouvoir automatiser leur traitement à coup deCode : Tout sélectionner
foreach($_POST as $key => $value) $monprojet->$key=$value;Je ne comprends pas bien à quoi sert le "singleton" et je ne crois pas qu'il puisse m'aider pour générer mes champs de formulaire.
abstract class Toto
{
// Tableau des instances
//
private static $arrayPool = Array();
// Même principe que le Singleton: Ni New & ni Clone
//
private function __construct()
{
}
private function __clone()
{
}
// Initialisation
//
function static register($name, $mixed)
{
if (!is_string($name)) die ("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Argument invalide, ID déja référencé !");
if (!is_object($mixed) && !is_string($mixed)) die("Argument attendu string ou instance !");
if (is_string($mixed) && !class_exists($mixed)) die("La class est introuvable !");
self::$arrayPool[$name] = is_object($mixed) ? new $mixed() : $mixed;
return self::$arrayPool[$name];
}
// Récupère l'instance
//
function static getInstance($name)
{
if (!is_string($name)) die("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Clef inconnue, instance introuvable !");
return self::$arrayPool[$name];
}
.
.
.
}
Voila, une class de pool d'instances (ce pattern porte un nom mais j'ai un trou. L'appel se fait par// La class qui sera enregistrée
//
class ParentToto
{
// En admétant qu'on ne veuille l'instancier
//
protected function __construct()
{
}
private function __clone()
{
}
.
.
.
}
abstract class Toto
{
// Tableau des instances
//
private static $arrayPool = Array();
// Initialisation
//
function static register($name)
{
if (!is_string($name)) die ("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Argument invalide, ID déja référencé !");
self::$arrayPool[$name] = new parent();
return self::$arrayPool[$name];
}
// Récupère l'instance
//
function static getInstance($name)
{
if (!is_string($name)) die("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Clef inconnue, instance introuvable !");
return self::$arrayPool[$name];
}
.
.
.
}
Voila, je pense que tu as un peu plus de matos pour réaliser ce que tu veux.Tsss... tsss... Je vois ton oeuil plein de curiositéJe crois qu'il va me falloir de la doc détaillée, parce que là, je ne comprends rien ("pattern", "pool", des classes "abstraites", la syntaxe avec ::, etc.).![]()
the_good_technician [a.t.] y-a-h-o-o.
07-Aug-2009 04:32
Sometimes it's necessary to retrieve the value of $this from within an object.
This solution dedicates a public var $ID to store a unique identifier for the object:
<?php
class Someclass {
public $ID;
public function what_is_this() {
return '$this is: ' . $this->get_varname();
}
private function get_varname() {
$this->ID = uniqid();
foreach($GLOBALS as $key => $val) {
if (is_a($val,'Someclass')) {
if ($val->ID === $this->ID) {
return $key;
break;
}
}
}
}
}
// example:
$my_var_instance = new Someclass;
echo $my_var_instance->what_is_this(); // returns '$this is: my_var_instance'
?>
Bye HawkJustement : comment appréhender la logique objet en question et la syntaxe qui va avec ? Est-ce que tu aurais des tutoriels du genre "la programmation objet en PHP pour les nuls mais complète quand même" ?Plus sèrieux, même si ce sont des termes "barbares" c'est assez simple. Donc t'en fais pas, tout
viendra au moment ou ca viendra. Essaie d'apréhender la logique Objet après ce sera du
gateau.
Ah merci, je vais regarder ça en détail.tiré de la doc de PHP