Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициалия статичных свойств класса, как присвоить по совпадениям 
:(
    Опции темы
31416
Дата 10.10.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



есть статичный класс с свойствами
class::prop1
class::prop2
class::prop3
...
class::propN

есть массив
array(
prop1=>'val1'
prop2=>'val1'
prop3=>'val1'
..
propN=>'valN'
)

как сделать чтобы по совпадении ключей массива с соответствующими свойствами - свойствам присваивались соответствующие элементы массива?
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
IAmEternaL
Дата 10.10.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.10.2007
Где: Киев, Украина

Репутация: нет
Всего: нет



ну вот решение:
Код

class classFoo
{
    public static $property1 = 0;
    public static $property2 = 0;
    public static $property3 = 0;
    public static $property4 = 0;

    public static function setProperties($properties)
    {
        foreach ($properties as $property => $value) {
            if (!isset(self::$$property)) {
                continue;
            }
            self::$$property = $value;
        }
    }
}

$properties = array(
    'property1' => 'value1',
    'property2' => 'value2',
    'property3' => 'value3',
    'property4' => 'value4',
);

classFoo::setProperties($properties);

при чем, замечу, присвоение значения (не null)  статическим пропертям класса обязательно! иначе isset выдаст false

Это сообщение отредактировал(а) IAmEternaL - 10.10.2007, 15:40
PM MAIL ICQ Skype   Вверх
IAmEternaL
Дата 11.10.2007, 10:06 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.10.2007
Где: Киев, Украина

Репутация: нет
Всего: нет



ну так что - помогло? кстати я подумал о каком-то решении проблемы инициализации пропертей при обьявлении в классе...
возможно правильным решением было бы задать константу типа define('CLASSFOO_DEFAULT_VALUE', 'ABCD'); где ABCD - значение, которые стопудоф не будет использоваться для этих переменных... может даже md5 какой-то
типа так:
Код

define('CLASSFOO_DEFAULT_VALUE', md5('krab'));
class classFoo
{
    public static $property1 = CLASSFOO_DEFAULT_VALUE;
    public static $property2 = CLASSFOO_DEFAULT_VALUE;
    public static $property3 = CLASSFOO_DEFAULT_VALUE;
    public static $property4 = CLASSFOO_DEFAULT_VALUE;

    public static function setProperties($properties)
    {
        foreach ($properties as $property => $value) {
            if (!isset(self::$$property)) {
                continue;
            }
            self::$$property = $value;
        }
    }
}

$properties = array(
    'property1' => 'value1',
    'property2' => 'value2',
    'property3' => 'value3',
    'property4' => 'value4',
);

classFoo::setProperties($properties);

а вообще я бы на твоем месте использовал бы синглтон с переопределенным getter'ом, что намного проще (имха)
Код

class classFoo
{
    static $instance;

    private $properties = array();

    public static function & getInstance(){
        if(is_null(self::$instance)){
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function __get($property)
    {
        return isset($this->properties[$property]) ? $this->properties[$property] : null;
    }

    public function __set($property, $value)
    {
        $this->properties[$property] = $value;
        return $this;
    }

    public function setProperties($properties)
    {
        $this->properties = $properties;
        return $this;
    }
}

$properties = array(
    'property1' => 'value1',
    'property2' => 'value2',
    'property3' => 'value3',
    'property4' => 'value4',
);

$objectFoo = classFoo::getInstance();
$objectFoo->setProperties($properties);

$objectFoo->newProperty = 'newValue';
echo $objectFoo->{'new' . 'Property'};

при чем ф-ция setProperties используется для первичной инициализации пропертей (можно сделать и просто добавления массива - array_merge к твоим услугам)
+ этой реализации естественно и в том, что обращение по типу как на строке 42 возможно
можно и как на 43 - это типа доступ через динамически генерируемое имя, может пригодится (во всяких там циклах)
PM MAIL ICQ Skype   Вверх
31416
Дата 14.10.2007, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



ага помогло) спасибо за исчерпывающий ответ)
синглетон конечно тут лучше всего - но мне нужно было проиницировать уже написанный класс - а проперти там были завязаны на отдельные его переменные...

я только не понял смысл зачем создавать константу и присваивать ее пропертям в начале? что ты  тут имел ввиду - для чего это поясни плиз?

и еще все хотел спросить но не знал у кого)  -   public static function & getInstance()
для чего используется символ & в этой записи?!

--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 14.10.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(31416 @  14.10.2007,  03:32 Найти цитируемый пост)
и еще все хотел спросить но не знал у кого)  -   public static function & getInstance()
для чего используется символ & в этой записи?!

Пережитки прошлого. Это символ говорит о том, что объект будет передаваться(в данном возвращаться) по ссылке, но в PHP 5 объекты и так возвращаются по ссылке, т.ч. в данном случае амперсанд совершенно не нужен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.