2016-07-30 1 views
6

Просто пытаюсь сохранить и закрепить источники из PHPBench.comАнализировать ошибка: синтаксическая ошибка, неожиданный «новый» (T_new) в .../test6_2.php на линии 20

и нажмите эту ошибку (сайт вниз и автор не ответил на вопросы). Это источник:

<?php 

// Initial Configuration 
class SomeClass { 
    function f() { 

    } 
} 
$i = 0; //fix for Notice: Undefined variable i error 

// Test Source 
function Test6_2() { 
    //global $aHash; //we don't need that in this test 
    global $i; //fix for Notice: Undefined variable i error 

    /* The Test */ 
    $t = microtime(true); 
    while($i < 1000) { 
    $obj =& new SomeClass(); 
    ++$i; 
    } 

    usleep(100); //sleep or you'll return 0 microseconds at every run!!! 
    return (microtime(true) - $t); 
} 

?> 

Является ли он допустимым синтаксисом или нет? Исправьте меня, если я ошибаюсь, но думаю, что он создает ссылку на SomeClass, поэтому мы можем позвонить по номеру new $obj() ... Спасибо заранее за помощь.

+0

'= & new ...' - недопустимый синтаксис –

+0

Экземпляр класса должен быть назначен переменной, поэтому вам нужно назначить экземпляр переменной, а затем поместить ссылку на переменную в '$ obj' , но мой вопрос: зачем вам нужна ссылка? –

+0

Это тест - сравнение между '= new' и' = & new' при создании нового объекта. – 1000Gbps

ответ

5

Объекты всегда хранятся по ссылке в любом случае. Вам не нужно =&, и, как прокомментировала Шарлотта, это устаревший синтаксис.

Correct me if I'm wrong but think it creates a reference to SomeClass, so we can call new $obj() .

Нет, это неверно. Оператор new всегда создает экземпляр класса, а не ссылку на класс как тип.

Вы можете создать экземпляр переменных объекта просто путем создания переменной строки с именем класса и с использованием этого.

$class = "MyClass"; 
$obj = new $class(); 

функции, такие как get_class() или ReflectionClass::getName() возвращает имя класса в виде строки. В PHP нет понятия «ссылка на класс», как в Java.

Самое близкое, о чем вы думаете, это ReflectionClass::newInstance(), но это ненужный способ динамического создания объекта. В почти каждом случае лучше всего использовать new $class().

+0

Лучше ли использовать больше памяти для определения строковых переменных, говоря о микрообъектах? – 1000Gbps

+1

Лучше чем? Не определять строковые переменные? Это просто скаляр. Если ваш код настолько чувствителен к производительности, что использование строковой переменной является нарушителем транзакций, то, вероятно, вы, вероятно, не должны использовать PHP в первую очередь. –