0
votes

PHP - comment vérifier que deux références pointent vers le même objet sous-jacent (adresse mémoire)?

Je suis d'origine Java et je suis en quelque sorte nouveau sur PHP.

Je me demande s'il existe un PHP équivalent à l'opération "==" de Java qui vérifie fondamentalement si deux références se réfèrent exactement au même objet sous-jacent. (PHP == et === ressemblent plus à la méthode equals de Java, qui vérifie si les deux objets sous-jacents ont la même valeur)

Clarification: Ma question ne concerne pas les différences entre == et === en PHP ni comment comparer les valeurs en PHP. Je cherche un moyen de voir si 2 variables font référence au même objet / adresse mémoire. La même adresse objet / mémoire signifie que lorsque je mets à jour la variable $ a, $ b doit également être mis à jour et vice versa car $ a et $ b font référence à la même chose.


2 commentaires

En fait les == et === ont une fonction différente, le == vérifie seulement s'ils sont égaux et === vérifie s'ils sont identiques. Cela pourrait aider. stackoverflow.com/questions/80646/...


Je pense que cette question est pertinente, stackoverflow.com/questions/5153528/… . Je ne sais pas si cela a changé avec 7 cependant, la présomption est non.


3 Réponses :


0
votes

Lors de l'utilisation de l'opérateur de comparaison (==), les variables de chaque objet sont comparées de manière simple, c'est-à-dire: deux instances d'un objet sont égales si elles ont les mêmes attributs et valeurs (les valeurs sont comparées à ==), et ce sont des instances de la même classe.

Lorsque l'opérateur d'identité (===) est utilisé, les variables d'un objet sont identiques oui et uniquement si elles font référence à la même instance de la même classe.


5 commentaires

Les opérateurs de comparaison examinent uniquement la valeur et le type de données. 3v4l.org/mtVkU donc if they refer to the same instance of the same class est incorrect.


Je pense que vous avez mal compris ma question. Je veux voir si 2 variables font référence au même objet / adresse mémoire. Ils ont une valeur identique ne signifie pas qu'ils sont le même objet. Par exemple, lorsque vous modifiez A, B doit également être modifié car A et B font référence à la même chose.


@ user3783243 Vous contredisez la documentation officielle de PHP? Votre exemple montre seulement que PHP fait toujours quelque chose qui est similaire à String.intern() en Java - Les chaînes avec la même valeur pointent vers le même objet.


@ErwinBolwidt De quelle documentation parlez-vous? Je fais référence àphp.net/manual/en/language.operators.comparison.php, ce à quoi cette réponse se réfère. Comment pouvez-vous dire que les Strings with the same value point to the same object ? Je peux avoir deux objets différents avec la même valeur.


php.net/manual/en/language.oop5.object-comparison.php "Lors de l'utilisation de l'opérateur d'identité (===), les variables objet sont identiques si et seulement si elles font référence à la même instance de la même classe." - et l'OP parle d'objets si je comprends bien.



4
votes

=== ne montre que si les deux variables ont le même type et la même valeur, mais ne peut pas montrer si les deux variables pointent vers la même adresse.

Php n'expose pas ceci si deux variables pointent vers la même adresse.

Mais vous pouvez l'obtenir avec une solution de contournement.

Méthode 1. Obtenez-le avec les informations de débogage, par exemple var_dump ou debug_zval_dump() .

Façon 2. Modifiez la variable $a , et vérifiez si $ b est également modifié.


0 commentaires

0
votes

La fonction de sérialisation peut être abusée pour vérifier si deux variables sont identiques.

<?php

// check if two variables are the same reference
function same(&$a, &$b) {
  // serialize an array containing only the two arguments
  // check if the serialized representation ends with a reference.
  return substr(serialize([&$a, &$b]), -5) === 'R:2;}';
}

$a = 4;
$b = &$a;
$c = 4;

echo "same(\$a, \$b) === " . var_export(same($a, $b), true) . "\n";
echo "same(\$a, \$c) === " . var_export(same($a, $c), true) . "\n";
echo "same(\$b, \$c) === " . var_export(same($b, $c), true) . "\n";

// same($a, $b) === true
// same($a, $c) === false
// same($b, $c) === false

?>

Attention:

  • Des méthodes magiques comme __serialize () ou __sleep () peuvent provoquer des effets secondaires.
  • Les performances peuvent être affectées si vos variables sont des objets volumineux.
  • Si PHP modifie la sortie de sérialisation dans une nouvelle version, cette fonction peut être interrompue.


0 commentaires