IS_A () est utilisé pour déterminer si un objet est une instance de la classe spécifiée ou une instance de sous-classe de la classe. La signature de la fonction est la suivante:
bool is_a(object $object, string $class_name, bool $allow_string = false)
$ objet : l'objet à détecter.
$ class_name : chaîne de nom de classe.
$ allow_string (php 7.2+): permet de passer dans les chaînes de nom de classe au lieu d'objets (généralement pas couramment utilisés).
Exemple:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "C'est un Animal Objets d'une classe ou de sous-classes";
}
Ici, is_a () revient vrai parce que le chien est une sous-classe d' animaux .
Property_exists () est utilisé pour déterminer si un objet déclare une propriété, que le modificateur d'accès de la propriété soit public , protégé ou privé . Signature de la fonction:
bool property_exists(object|string $class, string $property)
$ class : une chaîne d'objet ou de nom de classe.
$ propriété : chaîne de nom de propriété.
Exemple:
class Person {
private $name;
public $age;
}
$p = new Person();
if (property_exists($p, 'name')) {
echo "Les objets ont des propriétés name";
}
if (property_exists($p, 'age')) {
echo "Les objets ont des propriétés age";
}
Property_exists () à lui seul ne peut pas dire si le code actuel peut accéder à la propriété, car même les propriétés privées ou protégées reviendront vrai . Et is_a () peut aider à déterminer la classe de l'objet et à combiner la structure de la classe pour déterminer les autorisations d'accès.
Cependant, PHP lui-même n'a pas de fonction directe pour déterminer la "sécurité d'accès" d'une propriété - c'est-à-dire si le code actuel a l'autorisation d'accéder à la propriété. La pratique habituelle est:
La première utilisation is_a () pour déterminer si l'objet appartient à une certaine plage de classe contrôlable.
Utilisez ensuite Property_exists () pour déterminer si la propriété existe.
Enfin, l'interface d'accès est définie par la réflexion ou le temps de conception pour assurer la sécurité de l'accès à la propriété.
<?php
class User {
public $username;
protected $email;
private $password;
public function __construct($username, $email, $password) {
$this->username = $username;
$this->email = $email;
$this->password = $password;
}
}
function checkPropertyAccess($obj, $property, $allowedClass) {
// Déterminez si un objet est une classe ou sa sous-classe qui est autorisée à accéder
if (!is_a($obj, $allowedClass)) {
return false;
}
// Déterminez si l'attribut existe
if (!property_exists($obj, $property)) {
return false;
}
// Utilisez la réflexion pour déterminer la visibilité des attributs
$reflection = new ReflectionObject($obj);
if (!$reflection->hasProperty($property)) {
return false;
}
$prop = $reflection->getProperty($property);
// Déterminez si l'attribut estpublic
if ($prop->isPublic()) {
return true;
}
// Sinonpublic,Cela signifie que vous ne pouvez pas accéder directement,Restriction de sécurité de l'accès
return false;
}
$user = new User('alice', 'alice@example.com', 'secret');
var_dump(checkPropertyAccess($user, 'username', 'User')); // true
var_dump(checkPropertyAccess($user, 'email', 'User')); // false
var_dump(checkPropertyAccess($user, 'password', 'User')); // false
var_dump(checkPropertyAccess($user, 'nonexist', 'User')); // false
var_dump(checkPropertyAccess(new stdClass(), 'username', 'User')); // false
IS_A () est utilisé pour déterminer si un objet appartient à une certaine classe ou à sa sous-classe pour assurer la sécurité de la portée d'accès.
Property_exists () est utilisé pour détecter si l'objet déclare la propriété spécifiée.
La combinaison du mécanisme de réflexion peut déterminer davantage les droits d'accès des attributs et éviter un accès illégal aux attributs privés ou protégés.
Dans le développement réel, afin d'assurer la sécurité de l'accès à la propriété, il est recommandé d'exposer les propriétés par encapsulation (telle que la méthode Getter / Setter) plutôt que d'accès direct.
En utilisant ces fonctions raisonnablement, la robustesse et la sécurité du code peuvent être efficacement améliorées, et les erreurs d'exécution et les risques de sécurité potentiels peuvent être réduits.