Nasıl dinamik özellik değerleri döndürmek için __ çağrısı kullanabilirsiniz

0 Cevap php

Ben dinamik olarak yerine tek amacı bu değerleri geri dönmek olacaktır fonksiyonların bir takım yaratma __ çağrısı kullanarak bir sınıf için özellik değerlerini dönmek için bir yol düşünmeye çalışıyorum. Ben fikir (örneğin) istemek $this->fetch_PersonFirstName() var ve sınıf kontrolünü $this->person["first_name"] ayarlanırsa ve değeri döndürmek mümkün değildir. Başka bir örnek $this->fetch_BookGenreTitle() arama ve sınıf $this->book["genre"]["title"] değerini döndürmek sahip olacaktır. Böyle bir şey otomatik olarak belirlemek için sırayla kontrol biraz yapmak zorunda olacağını biliyorum $this->book["genre_title"] yok bu yana, örneğin, o $this->book["genre"]["title"] için kontrol etmelisiniz .

Şimdiye kadar (nedense) (örneğin benim bir kişi örnek olarak), bir dizi değerler döndürmek için çalışır ama böyle gibi çok boyutlu bir dizinin değerlerini (döndürmek için çalışırken sorun hızla gelişir bu kod ile geldim Benim yukarıdaki kitap örneği). Akılda çıplak, ben hala __ çağrısı yöntemi birinin varlığını kontrol etmek için bir yol düşünmeye çalışıyorum ve bu yoksa, o zaman başka.

, Burada bana bir çizgi atmak edin. Bunu anlamaya çalışıyorum kafamı duvara beceriyor oldum ve bu beni öldürüyor.

<?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();
?>

0 Cevap