Есть ли в классе php простой способ определения переменных с помощью функции? - PullRequest
1 голос
/ 31 января 2012

в моем классе у меня есть массив, определенный так

class t {
    var $settings = array();
}

Я буду использовать эти настройки довольно часто, поэтому вместо того, чтобы писать $this->settings['setting'] везде, я хотел развернуть функцию, которая автоматически определяет эти настройки в локальных переменных.

private function get_settings () {

            $array = $this->settings['array'];
            $foreign_key = $this->settings['foreign_key'];
            $limit = $this->settings['limit'];
            $tableclassid = $this->settings['tableclassid'];
            $pager = $this->settings['pager'];
            $container = $this->settings['container'];
            $extracolumn = $this->settings['extracolumn'];
    }

Теперь я хочу получить эти переменные и использовать их в другой функции в классе. В примере

public function test () {
     $this->get_settings();
     return $foreign_key;
}

и я хочу вернуть $this->settings['foreign_key']

есть ли способ сделать это? Или мне нужно загромождать все функции этим блоком кода, который есть у get_settings ()?

Я ценю помощь .. спасибо:)

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Используйте встроенную функцию extract(), которая извлекает массив в отдельные переменные в текущей области.

extract($this->settings);

Если вам необходимо изменить эти локальные переменныеотраженный в исходном массиве, извлеките их как ссылки.

extract($this->settings, EXTR_REFS);

Я не могу сказать, что предпочел бы использовать этот метод сам, или даже рекомендую вам сделать это.Внутри класса гораздо удобнее читать и понимать их в свойстве массива.В общем, я никогда не использую extract().

1 голос
/ 31 января 2012

Вы всегда можете перегрузить магические функции:

<?php

class DynamicSettings
{
    /**
     * Stores the settings
     * @var array
     **/
    protected $settings = array();

    /**
     * Called when something like this: 
     *  $dynset->name = value;
     * is executed.
     **/
    public function __set($name, $value)
    {
        $this->settings[$name] = $value;
    }

    /**
     * Called when something like this: 
     *  $value = $dynset->name;
     * is executed.
     **/
    public function __get($name)
    {
        if (array_key_exists($name, $this->settings)) 
        {
            return $this->data[$name];
        }
        $trace = debug_backtrace();
        trigger_error('Undefined dynamic property ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**
     * Called when checking for variable existance
     **/
    public function __isset($name)
    {
        return isset($this->settings[$name]);
    }

    /**
     * Called when unsetting some value.
     **/
    public function __unset($name)
    {
        unset($this->settings[$name]);
    }

}

$dynset = new DynamicSettings();
$dynset->hello = "Hello "; // creates array key "hello" with value "Hello "
$dynset->world = "World!"; // creates array key "world" with value "World!"

echo $dynset->hello . $dynset->world; // outputs "Hello World!"

Попробуйте расширить класс «DynamicSettings» и использовать эти ключи в качестве членов класса.

1 голос
/ 31 января 2012

Просто передайте это как собственность.Примерно так:

$class = new T();

А потом:

$class->getSettings('varname');

И в функции:

function get_settings($varname){
    return $this->settings[$varname];
}

Или использовать функцию перегрузки __get():

публичная функция __get ($ name) {return $ this-> settings [$ name];}

И назовите это так:

$ class-> varname;

(несуществующая функция / переменная в классе, будет отправлена ​​функции перегрузки get ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...