PHP Conference Japan 2024

ReflectionMethod::setAccessible

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

ReflectionMethod::setAccessible設定方法的可存取性

描述

public ReflectionMethod::setAccessible(bool $accessible): void

允許透過 ReflectionMethod::invoke() 方法調用受保護或私有的方法。

注意 自 PHP 8.1.0 起,呼叫此方法無效;預設情況下,所有方法都是可調用的。

參數

accessible

true 表示允許存取,或 false 表示不允許存取。

回傳值

不回傳任何值。

範例

範例 #1 簡單的類別定義

<?php
class MyClass
{
private function
foo()
{
return
'bar';
}
}

$method = new ReflectionMethod("MyClass", "foo");
$method->setAccessible(true);

$obj = new MyClass();
echo
$method->invoke($obj);
echo
$obj->foo();
?>

以上範例的輸出類似於

bar
Fatal error: Uncaught Error: Call to private method MyClass::foo() from global scope in /in/qdaZS:16

參見

新增筆記

使用者貢獻筆記 1 則筆記

dave1010 at gmail dot com
13 年前
這對於存取私有方法很方便,但請記住,通常會將事物設為私有是有原因的!單元測試是其中一種(有爭議的)使用情況。

範例
<?php
class Foo {
private function
myPrivateMethod() {
return
7;
}
}

$method = new ReflectionMethod('Foo', 'myPrivateMethod');
$method->setAccessible(true);

echo
$method->invoke(new Foo);
// 輸出 "7"
?>

這與 PHPUnit 搭配使用效果很好:https://php.dev.org.tw/manual/en/reflectionmethod.setaccessible.php
To Top