[JAVA] [PHP] Pour ceux qui s'inquiètent du poids ~ Cas particulier privé ~

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.

Essayez d'ajouter une méthode

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! ** **

Pense sérieusement

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 ***.

Pourquoi faites-vous une chose aussi gênante?

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 ().

Résumé

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.

Recommended Posts

[PHP] Pour ceux qui s'inquiètent du poids ~ Cas particulier privé ~
Résumé de la qualification Java Programmer Gold SE 8 (pour ceux qui connaissent Java)
Pour ceux d'entre vous qui pensent ne pas pouvoir lire JS au printemps?