Как объявить динамический класс PHP с помощью {'property-names-like-this'} - PullRequest
1 голос
/ 17 февраля 2012

Я переписываю приложение из .NET в PHP. Мне нужно создать класс, как это:

class myClass
{
    public ${'property-name-with-minus-signs'} = 5;
    public {'i-have-a-lot-of-this'} = 5; //tried with "$" and without
}

Но это не работает. Я не хочу использовать что-то вроде этого:

$myClass = new stdClass();
$myClass->{'blah-blah'};

Потому что у меня много этого в коде.

Редактировать несколько дней спустя: я писал приложение, которое использует SOAP. Эти причудливые имена используются в API, с которым мне приходилось общаться.

Ответы [ 3 ]

9 голосов
/ 17 февраля 2012

Вы не можете использовать дефисы (тире) в свойствах класса PHP.Имена переменных PHP, свойства классов, имена функций и имена методов должны начинаться с буквы или символа подчеркивания ([A-Za-z_]) и могут сопровождаться любым количеством цифр ([0-9]).

Вы можете обойти это ограничение, используя memberперегрузка:

class foo
{
    private $_data = array(
        'some-foo' => 4,
    );

    public function __get($name) {
        if (isset($this->_data[$name])) {
            return $this->_data[$name];
        }

        return NULL;
    }

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

$foo = new foo();
var_dump($foo->{'some-foo'});
$foo->{'another-var'} = 10;
var_dump($foo->{'another-var'});

Однако я бы очень не рекомендовал этот метод, так как он очень интенсивный и просто плохой способ программирования.Переменные и члены с тире не являются общими в PHP или .NET, как было указано.

5 голосов
/ 21 февраля 2012

Я использовал такой код:

class myClass
{

    function __construct() {

        // i had to initialize class with some default values
        $this->{'fvalue-string'} = '';
        $this->{'fvalue-int'} = 0;
        $this->{'fvalue-float'} = 0;
        $this->{'fvalue-image'} = 0;
        $this->{'fvalue-datetime'} = 0;   
    }
}
1 голос
/ 17 февраля 2012

Вы можете использовать магический метод __get , чтобы достичь этого, хотя это может стать неудобным, в зависимости от цели:

class MyClass {
    private $properties = array(
        'property-name-with-minus-signs' => 5
    );

    public function __get($prop) {
        if(isset($this->properties[$prop])) {
            return $this->properties[$prop];
        }

        throw new Exception("Property $prop does not exist.");
    }
}

Это должно хорошо работать для ваших целей,однако, учитывая, что - s не разрешены в идентификаторах в большинстве языков .NET в любом случае, и вы, вероятно, используете индексатор, который аналогичен __get.

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