2024 年 PHP 日本研討會

property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

property_exists 檢查物件或類別是否具有屬性

說明

property_exists(物件|字串 $object_or_class, 字串 $property): 布林值

這個函式會檢查指定的類別中是否存在給定的 property(屬性)。

注意事項:

isset() 不同的是,即使屬性的值為 nullproperty_exists() 也會回傳 true

參數

object_or_class

要測試的類別名稱或該類別的物件。

property

屬性的名稱。

回傳值

如果屬性存在,則回傳 true,否則回傳 false

範例

範例 #1 property_exists() 的使用範例

<?php

class myClass {
public
$mine;
private
$xpto;
static protected
$test;

static function
test() {
var_dump(property_exists('myClass', 'xpto')); //true
}
}

var_dump(property_exists('myClass', 'mine')); //true
var_dump(property_exists(new myClass, 'mine')); //true
var_dump(property_exists('myClass', 'xpto')); //true
var_dump(property_exists('myClass', 'bar')); //false
var_dump(property_exists('myClass', 'test')); //true
myClass::test();

?>

備註

注意事項:

如果類別尚未被載入,使用此函式將會使用任何已註冊的 自動載入器

注意事項:

property_exists() 函式無法偵測使用 __get 魔術方法以魔術方式存取的屬性。

另請參閱

新增註釋

使用者貢獻的註釋 6 則註釋

g dot gentile at parentesigraffe dot com
9 年前
此函式的行為會根據屬性是否存在於類別宣告中,或是已動態新增,以及變數是否已使用 unset() 而有所不同。

<?php

class TestClass {

public
$declared = null;

}

$testObject = new TestClass;

var_dump(property_exists("TestClass", "dynamic")); // boolean false,如同預期
var_dump(property_exists($testObject, "dynamic")); // boolean false,同上

$testObject->dynamic = null;
var_dump(property_exists($testObject, "dynamic")); // boolean true

unset($testObject->dynamic);
var_dump(property_exists($testObject, "dynamic")); // boolean false,再次

var_dump(property_exists($testObject, "declared")); // boolean true,如同預期

unset($testObject->declared);
var_dump(property_exists($testObject, "declared")); // boolean true,即使已使用 unset()
Stefan W
11 年前
如果您在一個有命名空間的檔案中,並且想要將類別名稱作為字串傳遞,則必須包含類別名稱的完整命名空間,即使在相同的命名空間內也是如此。

<?
namespace MyNS;

class A {
public $foo;
}

property_exists("A", "foo"); // false(假)
property_exists("\\MyNS\\A", "foo"); // true(真)
?>
Nanhe Kumar
10 年前
<?php

class Student {

protected
$_name;
protected
$_email;


public function
__call($name, $arguments) {
$action = substr($name, 0, 3);
switch (
$action) {
case
'get':
$property = '_' . strtolower(substr($name, 3));
if(
property_exists($this,$property)){
return
$this->{$property};
}else{
echo
"未定義的屬性";
}
break;
case
'set':
$property = '_' . strtolower(substr($name, 3));
if(
property_exists($this,$property)){
$this->{$property} = $arguments[0];
}else{
echo
"未定義的屬性";
}

break;
default :
return
FALSE;
}
}

}

$s = new Student();
$s->setName('Nanhe Kumar');
$s->setEmail('nanhe.kumar@gmail.com');
echo
$s->getName(); //Nanhe Kumar
echo $s->getEmail(); // nanhe.kumar@gmail.com
$s->setAge(10); //未定義的屬性
?>
ewisuri [gmail]
10 年前
從 PHP 5.3.0 開始,從父類別呼叫 property_exists 會看到子類別中的私有屬性。

<?php
類別 P {
公開函式
test_prop($prop) { 傳回 property_exists($this, $prop); }
}

類別
Child 繼承 P {
私有
$prop1;
}

$child = 新 Child();
var_dump($child->test_prop('prop1')); // 從 PHP 5.3.0 開始為 true
saurabh dot agarwal89 at gmail dot com
9 年前
$a = 陣列('a','b'=>'c');
print_r((物件) $a);
var_dump( property_exists((物件) $a,'0'));
var_dump( property_exists((物件) $a,'b'));

輸出
stdClass 物件
(
[0] => a
[b] => c
)
布林(false)
布林(true)
biziclop
1 年前
我需要一個方法來確認在類別外部存取屬性是否可行,且不會產生錯誤/警告,同時要考慮到該類別可能會使用魔術方法 __isset/__get 來模擬不存在的屬性。

<?php
// 如果屬性可以使用 $obj->$prop 公開安全地存取,則返回 true
// 已經使用 PHP 5.1 - 8.2 測試過,參見 https://3v4l.org/QBTd1
function public_property_exists( $obj, $prop ){
// 允許執行魔術方法 $obj->__isset( $prop )(如果存在)
if( isset( $obj->$prop )) return true;

// 沒有以此名稱存在的公開/保護/私有屬性
if( ! property_exists( $obj, $prop )) return false;

// 屬性存在,但它是公開的嗎?
$rp = new ReflectionProperty( $obj, $prop );
return
$rp->isPublic();
}

//// 測試/示範
class C {
public
$public = "我是公開的!";
protected
$protected = "我是保護的!";
private
$private = "我是私有的!";
function
__isset( $k ){
return
substr( $k, 0, 5 ) === 'magic';
}
function
__get( $k ){
if(
$k === 'magic_isset_but_null') return null;
return
"我是 {$k}!";
}
}

$o = new C();
foreach( array(
'public', 'protected', 'private',
'magic', 'magic_isset_but_null',
'missing'
) as $prop ){
if(
public_property_exists( $o, $prop ))
echo
"\$o->{$prop} 是一個公開屬性,其值為:",
var_export( $o->$prop, true ), "\n";
else echo
"\$o->{$prop} 不是一個公開屬性。\n";
}
/*
$o->public 是一個公開屬性,其值為:'我是公開的!'
$o->protected 不是一個公開屬性。
$o->private 不是一個公開屬性。
$o->magic 是一個公開屬性,其值為:'我是 magic!'
$o->magic_isset_but_null 是一個公開屬性,其值為:NULL
$o->missing 不是一個公開屬性。
*/
To Top