2015-09-15 7 views
1

Я хочу объявить переменную внутри класса с неизвестным именемPHP объявить открытую переменную внутри функции

class Example { 
    function newVar($name, $value) { 
     $this->$name = $value; 
    } 
} 

И я хочу использовать его таким образом

$c = new Example(); 
$c->newVar('MyVariableName', "This is my Value"); 
echo($c->MyVariableName); 

Важно то, что Я не знаю имя переменной. Поэтому я не могу поставить public $MyVariable внутри класса.

Это так или иначе? и если да, могу ли я сделать это с различными областями (private, protected, public)?

+0

Свойство автоматически общественности и вы не можете определить другую видимость – Rizier123

+0

ли не код работает? Для меня это повторяет «Это моя ценность» –

+0

Возможный дубликат [Можете ли вы создавать динамические свойства экземпляра на PHP?] (Http://stackoverflow.com/questions/829823/can-you-create-instance-properties-dynamically- in-php) – samrap

ответ

1

U следует использовать magic methods__get и __set (пример без проверки):

class Example { 
    private $data = []; 

    function newVar($name, $value) { 
     $this->data[$name] = $value; 
    } 

    public function __get($property) { 
     return $this->data[$property]; 
    } 

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


$c = new Example(); 
$c->newVar('MyVariableName', "This is my Value"); 
echo($c->MyVariableName); 
// This is my Value 

$c->MyVariableName = "New value"; 
echo($c->MyVariableName); 
// New value 

См http://php.net/manual/en/language.oop5.magic.php

+0

Нет необходимости в методе 'newVar()', $ c-> MyVariableName = "Новое значение"; 'будет достаточным как для создания, так и для переназначения. – samrap

+0

@samrap Конечно, я знаю). – voodoo417

+0

Я просто уточнял для ОП. В текущем примере вам кажется, что вы должны сначала использовать метод 'newVar()' для создания экземпляра свойства " – samrap

0

Ваш поиск магического вызова. В PHP вы можете использовать функцию __call(), чтобы делать подобные вещи. Посмотрите здесь: http://www.garfieldtech.com/blog/magical-php-call

Off верхней части моей головы, что-то вроде

function __call($vari, $args){ 
    if(isset($this->$vari){ 
     $return = $this->$vari; 
    }else{ 
     $return = "Nothing set with that name"; 
    } 
} 

Это также будет работать на частные, защищенные и общественности. Можно также использовать его для вызова методов в соответствии с требованиями класса

+0

Магический метод '__call' используется для вызова динамических методов, а не для задания свойств. Пожалуйста, посмотрите http://php.net/manual/en/language.oop5.overloading.php – samrap

1

Если я понять это правильно, вы можете настроить немного с помощью ключа массива значений

class Example { 
    private $temp; 

    function __construct(){ 
     $this->temp = array(); 
    } 
    function newVar($name, $value) { 
     $this->temp[$name] = $value; 
    } 
    function getVar($name){ 
     return $this->temp[$name]; 
    } 
} 
$c = new Example(); 
$c->newVar('MyVariableName', "This is my Value"); 
echo($c->getVar('MyVariableName')); 

Вместо использования частного вы можете использовать защищенные, а также ,

+0

Это делает то же самое, что и у OP, только больше кода. – Rizier123

+0

, но как объект он будет всегда публичным, но теперь у вас могут быть разные типы разрешений на переменную и функции – Tom

+0

@ voodoo417 Мне нравится его метод лучше, чем у меня. – Tom

Смежные вопросы