IS_A ()는 객체가 지정된 클래스의 인스턴스인지 또는 클래스의 서브 클래스 인스턴스인지를 결정하는 데 사용됩니다. 함수 서명은 다음과 같습니다.
bool is_a(object $object, string $class_name, bool $allow_string = false)
$ 객체 : 감지 할 객체.
$ class_name : 클래스 이름 문자열.
$ allow_string (php 7.2+) : 객체 대신 클래스 이름 문자열을 통과 할 수 있습니다 (일반적으로 일반적으로 사용되지 않음).
예:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "이것은 a입니다 Animal 클래스 또는 서브 클래스의 객체";
}
여기에서, 개는 동물 의 서브 클래스이기 때문에 is_a ()는 true를 반환합니다.
Property_Exists ()는 속성의 액세스 수정자가 공개 , 보호 또는 개인인지 여부에 관계없이 객체가 속성을 선언하는지 여부를 결정하는 데 사용됩니다. 기능 서명 :
bool property_exists(object|string $class, string $property)
$ class : 객체 또는 클래스 이름 문자열.
$ 속성 : 속성 이름 문자열.
예:
class Person {
private $name;
public $age;
}
$p = new Person();
if (property_exists($p, 'name')) {
echo "객체에는 속성이 있습니다 name";
}
if (property_exists($p, 'age')) {
echo "객체에는 속성이 있습니다 age";
}
property_exists () 만으로는 현재 코드가 속성에 액세스 할 수 있는지 여부를 알 수 없습니다. 개인 또는 보호 된 속성조차도 사실이 반환되기 때문입니다. IS_A () 는 객체의 클래스를 결정하고 클래스 구조를 결합하여 액세스 권한을 결정할 수 있습니다.
그러나 PHP 자체는 부동산의 "액세스 보안", 즉 현재 코드에 부동산에 액세스 할 수있는 권한이 있는지 여부를 결정하는 직접적인 기능이 없습니다. 일반적인 관행은 다음과 같습니다.
먼저 IS_A ()를 사용하여 객체가 특정 제어 가능한 클래스 범위에 속하는지 여부를 결정합니다.
그런 다음 Property_Exists ()를 사용하여 속성이 존재하는지 확인하십시오.
마지막으로, 액세스 인터페이스는 반사 또는 설계 시간을 통해 설정되어 속성 액세스의 보안을 보장합니다.
<?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) {
// 객체가 클래스인지 또는 액세스 할 수있는 서브 클래스인지 결정
if (!is_a($obj, $allowedClass)) {
return false;
}
// 속성이 존재하는지 확인하십시오
if (!property_exists($obj, $property)) {
return false;
}
// 반사를 사용하여 속성의 가시성을 결정하십시오
$reflection = new ReflectionObject($obj);
if (!$reflection->hasProperty($property)) {
return false;
}
$prop = $reflection->getProperty($property);
// 속성이 있는지 여부를 결정하십시오public
if ($prop->isPublic()) {
return true;
}
// 그렇지 않다면public,직접 액세스 할 수 없다는 것을 의미합니다,액세스의 보안 제한
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 ()는 객체가 액세스 범위의 보안을 보장하기 위해 객체가 특정 클래스 또는 하위 클래스에 속하는지 여부를 결정하는 데 사용됩니다.
property_exists ()는 객체가 지정된 속성을 선언하는지 여부를 감지하는 데 사용됩니다.
반사 메커니즘을 결합하면 속성의 액세스 권한을 더 결정하고 개인 또는 보호 된 속성에 대한 불법적 인 액세스를 피할 수 있습니다.
실제 개발에서 부동산 액세스의 보안을 보장하기 위해 직접 액세스가 아닌 캡슐화 (예 : getter/setter 방법)를 통해 속성을 노출하는 것이 좋습니다.
이러한 기능을 합리적으로 사용함으로써 코드의 견고성과 보안을 효과적으로 개선 할 수 있으며 런타임 오류 및 잠재적 보안 위험을 줄일 수 있습니다.