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