0

次のコードに問題があります。

<?php
    class testClass
    {
        public $settings;

        public function __construct()
        {
            $this->settings = array(
                'paths' => array(
                    'protocol' => 'http'
                )
            );
        }

        public function getSomething()
        {
            $string = "settings['paths']['protocol']";

            echo $this->{$string};      /***** Line 19 *****/
        }
    }


    $obj = new testClass;
    $obj->getSomething();                          // Outputs a 'undefined' notice
    echo '<br />';
    echo $obj->settings['paths']['protocol'];      // Outputs http as expected
?>

これは私が採用しているコードの非常に基本的な例であり、実際のコードはより高度ですが、生成される出力/エラーは同じです。

基本的に、クラスコンストラクターはプロパティに設定配列を設定します。getSomething()メソッドは、配列パスを変数に割り当てます。変数は、echo $this->{$string};コードによって取得されます。

私が書くとき:$obj->getSomething();私は次のエラーを受け取ります:

Notice: Undefined property: testClass::$settings['paths']['protocol'] in /test.php on line 19

次のコードを書くとecho $obj->settings['paths']['protocol']、期待どおりになりますhttp

なぜこれが機能しないのかわかりません!! 誰かが光を当てることができれば、それは大いにありがたいです。

ありがとう

4

1 に答える 1

2

ええと、あなたは「」と呼ばれるプロパティを持っていませんsettings['paths']['protocol']。キーを持つsettingsキーを持つというプロパティがあります。ただし、PHPはコードのコピーと貼り付けのように解釈せず、存在しない「」というプロパティを探します。これはOOPコードに特有のことではなく、変数変数がどのように機能するかです。pathsprotocol$this->{$string}settings['paths']['protocol']


代わりに、次のようなものを提案します。

/**
 * Get settings, optionally filtered by path.
 *
 * @param string $path A path to a nested setting to be returned directly.
 * @return mixed The requested setting, or all settings if $path is null,
 *               or null if the path doesn't exist.
 */
public function get($path = null) {
    $value = $this->settings;

    foreach (array_filter(explode('.', $path)) as $key) {
        if (!is_array($value) || !isset($value[$key])) {
            return null;
        }
        $value = $value[$key];
    }

    return $value;
}

このように呼ばれます:

$obj->get('paths.protocol');

そして、楽しみのために、ここでは上記の機能的な実装を示します:; -3

public function get($path = null) {
    return array_reduce(
        array_filter(explode('.', $path)),
        function ($value, $key) { return is_array($value) && isset($value[$key]) ? $value[$key] : null; },
        $this->settings
    );
}
于 2013-03-27T13:12:18.997 に答える