O que está acontecendo exatamente ao instanciar com 'novo'?

Vamos considerar o seguinte código:

class a {
    public $var1;
    function disp(){
        echo $this->var1;
        }    
    }

$obj1 = new a;
echo '<br/>After instantiation into $obj1:<br/>';    
xdebug_debug_zval('obj1');  

$obj1->var1 = "Hello ";
echo '<br/><br/>After assigning "Hello" to  $obj->var1:<br/>';
$obj1->disp();

echo "<br/><br/>";  
xdebug_debug_zval('obj1');  

A saída

Depois da instanciação em $ obj1:
obj1: (refcount = 1, is_ref = 0) = classe a {public $ var1 = (refcount = 2, is_ref = 0) = NULL}

Depois de atribuir "Hello" a $ obj-> var1:
Ol

obj1: (refcount = 1, is_ref = 0) = classe a {public $ var1 = (refcount = 1, is_ref = 0) = 'Olá'}

Um por um

Depois da instanciação em $ obj1:
obj1: (refcount = 1, is_ref = 0) = classe a {public $ var1 = (refcount = 2, is_ref = 0) = NULL}

Porque$obj1->var1 terrefcount=2 quando houver apenas um objeto da classe a?

É por causa de como onew operador faz atribuição? PHP faz atribuição com referências. Quando instanciado comnew, nenhum nome de símbolo / variável está associado a essa instância. Mas, as propriedades da classe têm nomes. É orecount=2 Por causa disso

Se for esse o caso, ocorreu uma C.O.W (cópia na gravação) com uma cópia superficial do WRT na instância da classe. Enquanto as propriedades ainda apontam para o zval de propriedades criadas durante a instanciação usandonew.

Agora

Depois de atribuir "Hello" a $ obj-> var1:
Ol

obj1: (refcount = 1, is_ref = 0) = classe a {public $ var1 = (refcount = 1, is_ref = 0) = 'Olá'}

Então, quando atribuo um valor à propriedade$obj1->var1 um novo contêiner zval para essa propriedade e, portanto, orefcount=1?

Isso significa que o contêiner zval criado durante a instanciação usandonew ainda está vivo, mas não pode ser acessado, pois não há um símbolo / nome de variável associado a ele?

Observe (dexdebug: Recursos de exibição variável):
debug_zval_dump() é diferente dexdebug_debug_zval().

vazi xdebug_debug_zval [string varname [, ...]] )

Exibe informações sobre uma variável.

Esta função exibe informações estruturadas sobre uma ou mais variáveis que incluem suas informações de tipo, valor e recontagem. Matrizes são exploradas recursivamente com valores. Esta função é implementada de forma diferente da @ do Pdebug_zval_dump (), a fim de solucionar os problemas que essa função possui, porque a variável it, self é realmente passada para a função. A versão do Xdebug é melhor, pois usa o nome da variável para pesquisar a variável na tabela interna de símbolos e acessa todas as propriedades diretamente, sem ter que lidar com a passagem de uma variável para uma função. O resultado é que as informações que essa função retorna são muito mais precisas do que a função do PHP para mostrar informações zva

UPDATE : Dec 31th 2011:

Estou tentando ver como a alocação de memória ocorre quandoNov é usado. Mas há muitas outras coisas que tenho que fazer agora. Espero poder postar uma atualização útil em breve. Até então, aqui estão os links para o código em que eu estava olhando:

typedef union hdr
register ponteiro novo = malloc (sizeof (header) + size);
expr_without_variable: T_NEW class_name_reference
função zend_do_fetch_class

questionAnswers(2)

yourAnswerToTheQuestion