J'ai essayé de trouver un moyen de renvoyer dynamiquement des valeurs de propriété pour une classe en utilisant __call au lieu de créer une série de fonctions dont le seul but serait de renvoyer ces valeurs. L'idée que j'ai est de pouvoir demander (par exemple) $ this-> fetch_PersonFirstName() et de vérifier si la classe $ this-> person ["first_name"] est définie et renvoie la valeur. Un autre exemple serait d'appeler $ this-> fetch_BookGenreTitle() et que la classe renvoie la valeur $ this-> book ["genre"] ["title"]. Je sais quelque chose comme ceci devrait faire un peu de vérification afin qu'il détermine automatiquement que, par exemple, puisque $ ce-> livre ["genre_title"] n'existe pas, alors il devrait vérifier $ this-> book ["genre"] ["title"]. Jusqu'ici je suis arrivé avec du code qui (pour une raison quelconque) fonctionne pour retourner les valeurs d'un tableau (comme mon exemple de personne) mais mon problème se développe rapidement quand j'essaye de retourner les valeurs d'un tableau multidimensionnel (comme avec mon exemple de livre ci-dessus). Je suis toujours en train d'essayer de trouver un moyen pour que la méthode __call vérifie l'existence d'une méthode, et si elle n'existe pas, alors l'autre.Comment utiliser __call pour renvoyer dynamiquement des valeurs de propriété
S'il vous plaît, jetez-moi une ligne ici. Je me suis cogné la tête contre le mur en essayant de comprendre ça et ça me tue.
<?php
class Test
{
protected $person;
protected $book;
public function __construct()
{
$this->person["first_name"] = "John Smith";
$this->book["genre"]["title"] = "Suspense";
}
public function __call($method, $args)
{
$args = implode(", ", $args);
if (preg_match("/^fetch_([A-Z]{1,}[a-z]{1,})(.*)?/", $method, $match))
{
print_r($match);
echo "<br><br>";
$property = strtolower($match[1]);
$indexes = $match[2];
if (property_exists("Test", $property))
{
if ($indexes)
{
$indexes = preg_split("/(?<=[a-z])(?=[A-Z])/", $indexes);
$num_indexes = count($indexes);
$count_indexes = 1;
for ($count=0; $count<$num_indexes; $count++)
{
$record = strtolower($indexes[$count]);
$index .= $record;
$array .= "{$record}";
$var_index = $index;
$var_array = $array;
echo $var_index." {$count}<br>";
echo $var_array." {$count}<br>";
//print_r($this->{$property}{$var_array});
if ($count_indexes == $num_indexes)
{
if (isset($this->{$property}{$var_index}))
{
return $this->{$property}{$var_index};
}
else
{
return $this->{$property}{$var_array};
}
}
else
{
$index .= "_";
}
$count_indexes++;
}
echo "<br><br>";
}
else
{
return $this->{$property};
}
}
}
}
}
?>
<?php
$test = new Test();
echo $test->fetch_PersonFirstName();
echo "<br><br>";
echo $test->fetch_BookGenreTitle();
?>
ne soyez pas paresseux. Ajoutez les Getters dont vous avez besoin au lieu d'encourir la pénalité de performance de __call, et encore moins celle qui fait autant de travail. – Gordon