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 hdrregister ponteiro novo = malloc (sizeof (header) + size);
expr_without_variable: T_NEW class_name_reference
função zend_do_fetch_class