Quel a été le résultat de l'examen médical, tout le monde?
Eh bien, est-ce que le médecin vous a dit que vous étiez à nouveau en surpoids? C'est dur parce que ma femme se met en colère et que mon patron me dit de perdre du poids.
Alors gardez votre poids secret avec la propriété «privée»!
class Person
{
private $name;
//Top secret
private $weight;
public function __construct($name, $weight)
{
$this->name = $name;
$this->weight = $weight;
}
}
Oui, vous pouvez cacher votre poids avec ça. Je suis heureux.
Mais vous voulez connaître le poids de ce collègue qui semble être plus gros que vous. [^ 1]
[^ 1]: Qu'est-ce qui est amusant à savoir? Vous ne voulez pas vous plonger dans le sentiment de supériorité que "je suis plus mince que lui"?
Oui, j'ai écrit cette méthode pour vous.
class Person
{
private $name;
private $weight;
public function __construct($name, $weight)
{
$this->name = $name;
$this->weight = $weight;
}
/**
*Comparez si les poids sont les mêmes
*/
public function isWeightEqual($other)
{
return $this->weight === $other->weight;
}
}
Oh, mais «$ other-> weight» est une propriété «privée», alors n'est-ce pas inutile? Ceux qui ont pensé.
Pardon. Cela fonctionne très bien.
$a = new Person("Yamada Taro", 60.5);
$b = new Person("Jiro Tanaka", 60.5);
var_dump($a->isWeightEqual($b)); //--> bool(true)
Si vous faites de votre mieux, vous pourrez créer ʻisWeightGreaterThan () et ʻisWeightLessThan ()
.
** Il ne sert à rien d'essayer de cacher votre poids! ** **
En fait, il est correctement écrit dans Droits d'accès depuis d'autres objets dans le manuel PHP. ..
Les objets du même type peuvent accéder aux membres privés et protégés de l'autre, même s'il ne s'agit pas de la même instance. En effet, les détails de l'implémentation de l'objet sont connus à l'intérieur de l'objet.
On dit que c'est difficile, mais en bref, cela dit que vous pouvez accéder aux membres «privés» et «protégés» même si les instances sont différentes si elles sont du même type ***.
En fait, cette spécification est la même pour Java, mais [^ 2], [Java] Pourquoi puis-je accéder aux champs privés d'autres instances si elles sont dans la même classe? J'ai trouvé un très bon commentaire.
[^ 2]: Cela semble être la même chose en C ++ et C #. Voir Accès aux variables de membre privé.
@shirakamus Si private est une spécification accessible uniquement à partir de ceci, qu'arrive-t-il à l'implémentation de la méthode equals ...
En Java, les comparaisons d'objets sont effectuées avec la méthode ʻequals () . Chaque objet hérite de ʻObject.equals ()
comme suit:
public boolean equals(Object o) {
return this == o;
}
C'est généralement suffisant, mais vous pouvez également remplacer la méthode ʻequals () `. Certainement, ça ressemble à ça. [^ 3]
[^ 3]: En fait, il semble que vous deviez aussi remplacer hashCode ()
, mais je prendrai des mesures une fois. Pour plus de détails, consultez Suivez le contrat général lors de la substitution d'égaux.
public class Person
{
private String name;
private double weight;
Person(String name, double weight)
{
this.name = name;
this.weight = weight;
}
@Override
public boolean equals(Object other)
{
if (this == other) {
return true;
}
if (other instanceof Person) {
Person person = (Person) other;
//Vous accédez à un champ privé! !! !!
return person.name == this.name
&& person.weight == this.weight;
}
return false;
}
}
La partie importante est la partie person.weight == this.weight
.
Ce «person.weight» est le champ «private» de l'instance passé en argument, mais il est du même type «Person» et est accessible.
Si ce n'est pas possible, vous devrez passer par le getter, comme person.getWeight ()
.
Il n'y a pas de ʻequals () `comme Java en PHP, mais quand nous avons adopté l'orientation objet comme idée, nous l'avons probablement fait se comporter comme Java et d'autres langages orientés objet (probablement). ).
Eh bien, lorsqu'on lui demande s'il doit être utilisé positivement, il semble que ce ne soit pas bien connu, donc je pense qu'il vaut mieux l'arrêter.
En outre, en premier lieu, si vous perdez du poids, vous ne devriez pas avoir à vous soucier de ces choses gênantes.
** Vous devriez donc perdre du poids. ** **
(2018/1/13) J'ai ajouté un sous-titre.