Как «вызвать» экземпляр класса в PHP? - PullRequest
7 голосов
/ 09 октября 2009

есть ли возможность "вызвать" экземпляр класса с помощью строкового представления?

В этом случае я ожидаю, что код будет выглядеть так:

class MyClass {
  public $attribute;
}

$obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass
$obj->attribute = "Hello World";

Я думаю, что это должно быть возможно, так как PHP SoapClient принимает список classMappings, который используется для сопоставления элемента WSDL с классом PHP. Но как SoapClient "вызывает" экземпляры классов?

Ответы [ 3 ]

24 голосов
/ 09 октября 2009
$class = 'MyClass';
$instance = new $class;

Однако, если конструктор вашего класса принимает переменное число аргументов, и вы храните эти аргументы в массиве (вроде call_user_func_array), вы должны использовать отражение:

$class = new ReflectionClass('MyClass');
$args  = array('foo', 'bar');
$instance = $class->newInstanceArgs($args);

Существует также ReflectionClass::newInstance, но он делает то же самое, что и первый вариант выше.

Справка:

8 голосов
/ 13 февраля 2015

Другие ответы будут работать в PHP <= 5.5, но эта задача становится намного проще в PHP 5.6, где вам даже не нужно использовать рефлексию. Просто сделай: </p>

<?php

class MyClass
{
    public function __construct($var1, $var2)
    {}
}

$class = "MyClass";
$args = ['someValue', 'someOtherValue'];

// Here's the magic
$instance = new $class(...$args);
6 голосов
/ 09 октября 2009

Если число аргументов, необходимых конструктору, известно и постоянно, вы можете (как и другие предлагали) сделать это:

$className = 'MyClass';
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World";

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

<?php
$rf = new ReflectionClass('MyClass');
$obj = $rf->newInstanceArgs($arrayOfArguments);
$obj->attribute = "Hello World";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...