Я пытался придумать способ динамического возврата значений свойств для класса с использованием __call вместо создания множества функций, единственной целью которых было бы возвращение этих значений. У меня есть идея запросить (например) $ this-> fetch_PersonFirstName () и проверить класс, если $ this-> person ["first_name"] установить и вернуть значение. Другой пример будет вызывать $ this-> fetch_BookGenreTitle () и заставить класс возвращать значение $ this-> book ["genre"] ["title"] . Я знаю, что что-то вроде этого должно было бы сделать небольшую проверку, чтобы автоматически определить, что, например, поскольку $ this-> book ["genre_title"] не существует, тогда оно должно проверьте наличие $ this-> book ["genre"] ["title"] .
До сих пор я придумал код, который (по какой-то причине) работает для возврата значений массива (например, моего личного примера), но моя проблема быстро развивается, когда я пытаюсь вернуть значения многомерного массива ( например, как в моем примере с книгой выше). Не обращая внимания, я все еще пытаюсь придумать, как метод __call может проверить существование одного, а если его нет, то другого.
Пожалуйста, напишите мне здесь. Я бился головой о стену, пытаясь понять это, и это убивает меня.
<?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();
?>