尿酸高吃什么菜| 参片泡水喝有什么功效| 葛根粉是什么| 什么软件可以开空调| 水煎是什么意思| 小孩有口臭是什么原因引起的| 翠玉是什么玉| 唯利是图是什么生肖| 6月12日是什么星座| 为什么会吐| 股票pb是什么意思| 制冰机不制冰是什么原因| 长痔疮是什么引起的| im是什么意思| 葛根粉吃了有什么作用| 罢黜百家独尊儒术是什么意思| 为什么要喝酒| 咸池是什么意思| 结肠炎有什么症状| 什么人容易得妄想症| 话费为什么扣那么快| 什么是土象星座| 什么是事实婚姻| 女性安全期是什么时候| 人参长什么样子图片| 高血压可以喝什么饮料| skirt什么意思| 脑供血不足会导致什么后果| 必要条件是什么意思| 什么风化雨| 黄瓜敷脸有什么功效与作用| 前方高能什么意思| 农历六月十四是什么日子| 什么的梦| 爱发朋友圈的女人是什么心态| 兔子可以吃什么水果| 女性安全期是什么时候| 胃胀胃痛吃什么药| 宫内囊性回声代表什么| 右眼皮跳是什么意思| 往届毕业生是什么意思| 肺结节吃什么中药| 梦见雪是什么征兆| 长期熬夜有什么坏处| 喝牛奶就拉肚子是什么原因| 备孕吃叶酸有什么好处| 同房疼痛什么原因| 长针眼是什么原因| 心仪什么意思| 四大是什么| 月半是什么意思| 梦到拉粑粑是什么意思| 棉绸是什么面料| xpe是什么材料| 阿胶糕什么时候吃最好| 心脏是由什么组织构成的| 18岁属什么| 水痘用什么药| 7月7号是什么节日| 胰腺炎是什么| 心脏不好挂什么科室| 为什么会黄体破裂| 三国时期是什么朝代| 夏天脚底冰凉是什么原因| 凉白开是什么水| 脑动脉瘤是什么原因引起的| 嘴巴发麻是什么原因| 口嗨什么意思| cr5是什么意思| 后颈长痘痘是什么原因| 运动系统由什么组成| 这个季节适合种什么菜| 尿频尿急是什么症状| 老打瞌睡犯困是什么原因| av是什么意思| gbs是什么意思| 627是什么意思| 口干舌燥吃什么药最好| 藏毛窦是什么病| 办什么厂比较好| 嘴唇是紫色的是什么原因| 戒断反应是什么| sp是什么的缩写| 康复治疗技术学什么| 间羟胺又叫什么| 眼睛胀痛什么原因| 吃什么能阻止性早熟| 梦见前男友死了是什么意思| 乙型肝炎表面抗体阳性是什么意思| 凤凰花什么时候开| 什么食物含维生素c最多| 新生儿超敏c反应蛋白高说明什么| 今年40岁属什么生肖| 减张缝合是什么意思| 什么是偏旁什么是部首| 纪委是干什么的| 手上长疣是什么原因造成的| 孕妇缺维生素D对胎儿有什么影响| 下巴底下长痘痘是什么原因| 头三个月保胎喝什么汤| 心影不大是什么意思| 什么最解渴| 朝朝暮暮是什么意思| 肉质瘤是什么东西| 太安鱼是什么鱼| 冬阴功汤是什么味道| 指导是什么意思| 猫咪泪痕重是什么原因| 佛手瓜什么时候结果| 什么叫能量| 手机壳买什么材质的好| 鬼佬是什么意思| 什么冰淇淋最贵| 核磁共振能检查什么| chemical是什么意思| 糟老头是什么意思| airwalk是什么牌子| 形单影只什么意思| 五楼五行属什么| 铁窗泪什么意思| 性格什么意思| 10.8号是什么星座| 举不胜举的举是什么意思| 囊性结节是什么| 中国的国树是什么| 吃什么卵泡长得快又圆| 蒙圈什么意思| 检查阑尾炎挂什么科| bunny是什么意思| 什么人不能喝咖啡| 乙肝表面抗原大于250是什么意思| 周公解梦掉牙齿意味着什么| 双向是什么意思| 黄宗洛黄海波什么关系| 如常所愿是什么意思| 小灶是什么意思| 什么时候开始数伏| 打扰了是什么意思| 蒲瓜是什么瓜| 蓝颜知己是什么意思| 心脏缺血吃什么补得快| 南瓜和窝瓜有什么区别| 宫颈鳞状上皮增生是什么意思| 鸭子吃什么食物| 努力的意义是什么| 化验大便能查出什么病| 生辉是什么意思| 脆哨是什么| 脸无缘无故的肿是什么原因| 玉婷是什么| nec投影仪是什么牌子| 弥留之际什么意思| 穆萨是什么意思| 郑板桥是什么生肖| 鸡吃什么长得又快又肥| 算理是什么意思| 年柱亡神是什么意思| 拿什么拯救你我的爱人演员表| 孕妇喉咙痛吃什么好得最快| 夜宵吃什么好| 孩子总爱哭是什么原因| 梦见蝎子是什么预兆| 自强不息的息是什么意思| 股票五行属什么| 排毒吃什么最好能排脸上毒| 复试是什么意思| 米酒发酸是什么原因| 糖尿病可以吃什么肉| 不放屁吃什么药能通气| 凹儿念什么| 97年属什么今年多大| 掌纹多而乱代表什么| 莹五行属性是什么| 花青素有什么作用| 六指是什么原因导致的| 葡萄糖阳性是什么意思| 睡觉起来脸肿是什么原因引起的| 同工同酬什么意思| 小说be是什么意思| 什么叫做光合作用| 为什么是| 林格液又叫什么| uma是什么意思| 鹿的角像什么| 梦见已故的老人是什么意思| 白细胞减少是什么原因| 海鸥吃什么| 磨皮是什么意思| 月经期适合做什么运动| lyocell是什么面料| 圆是什么图形| 丰富多腔的腔是什么意思| 一个虫一个尧念什么| 什么牌子的手机好| 回锅肉是什么肉| 为什么一到晚上就咳嗽| 儿童风热感冒吃什么药| sla是什么意思| 温度计代表什么生肖| 海龟是什么动物| 意阑珊什么意思| 预科班什么意思| 自缢死亡是什么意思| 行政助理是干什么的| 肉燕是什么| 1984年属什么生肖| 孩子咳嗽有痰吃什么药| 芦荟有什么功效与作用| 怀孕初期吃什么蔬菜好| 为什么心里总想一个人| 切除子宫对身体有什么影响| 麻婆豆腐是什么菜系| 包皮是什么样子图片| 露从今夜白下一句是什么| soe咖啡是什么意思| 鱼腥草有什么功效| 有鸟飞进屋是什么预兆| 豇豆不能和什么一起吃| 喝什么泡水降血压最好| 女人补铁有什么好处| 冬天手脚冰凉是什么原因怎么调理| 板命什么意思| 福尔马林是什么| 黑京念什么| 梦见苍蝇是什么预兆| 玉仁玫白膏有什么功效| 什么样的生活| 脖子长痘痘是因为什么原因| 什么紫什么红| 红对什么| 镇关西是什么意思| 孤注一掷什么意思| 尿道痒痒是什么原因| 打玻尿酸有什么副作用吗| 幽门螺旋杆菌什么意思| ex是什么意思| 尿频尿急尿不尽吃什么药效果最好| 以纯属于什么档次| 胆囊壁结晶是什么意思| 嗯嗯嗯是什么意思| 廉租房和公租房有什么区别| 梦见输液是什么意思| 贫血吃什么水果补血最快| 人咬人有什么危害| 去韩国需要办理什么手续| 看胆囊挂什么科| caring什么意思| 六尘不染的生肖是什么| 为什么白带多| 梦见在水里游泳是什么意思| 秃顶是什么原因造成的| 歼31为什么没消息了| 什么水果维生素c含量最高| 中暑吃什么好得快| 体检前一天要注意什么| 小孩坐火车需要什么证件| nf是什么单位| 全国政协常委什么级别| 周公吐哺天下归心是什么意思| 相交是什么意思| 牛鞭是牛的什么部位| 灌肤是什么意思| 甘油三酯高吃什么药效果好| 鼻子上火是什么原因引起的| 百度
PHP 8.5.0 Alpha 4 available for testing

访问控制(可见性)

对属性或方法的访问控制(PHP 7.1.0 以后支持常量),是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。 被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

属性的访问控制

类属性可以定义为public, private 或者 protected。在没有任何访问控制关键字的情况下,属性声明为 public。

示例 #1 属性声明

<?php
/**
* Define MyClass
*/
class MyClass
{
public
$public = 'Public';
protected
$protected = 'Protected';
private
$private = 'Private';

function
printHello()
{
echo
$this->public;
echo
$this->protected;
echo
$this->private;
}
}

$obj = new MyClass();
echo
$obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
public $public = 'Public2';
protected
$protected = 'Protected2';

function
printHello()
{
echo
$this->public;
echo
$this->protected;
echo
$this->private;
}
}

$obj2 = new MyClass2();
echo
$obj2->public; // 这行能被正常执行
echo $obj2->protected; // 这行会产生一个致命错误
echo $obj2->private; // 未定义 private
$obj2->printHello(); // 输出 Public2、Protected2 和 Undefined

?>

不对称属性可见性

从 PHP 8.4 开始,属性也可以设置不对称的可见性,读取(get) 和写入(set)可以有不同的范围。 具体来说,可以单独指定set可见性,只要它不比默认可见性更宽。

示例 #2 不对称属性可见性

<?php
class Book
{
public function
__construct(
public private(
set) string $title,
public protected(
set) string $author,
protected private(
set) int $pubYear,
) {}
}

class
SpecialBook extends Book
{
public function
update(string $author, int $year): void
{
$this->author = $author; // OK
$this->pubYear = $year; // Fatal Error
}
}

$b = new Book('How to PHP', 'Peter H. Peterson', 2024);

echo
$b->title; // Works
echo $b->author; // Works
echo $b->pubYear; // Fatal Error

$b->title = 'How not to PHP'; // Fatal Error
$b->author = 'Pedro H. Peterson'; // Fatal Error
$b->pubYear = 2023; // Fatal Error
?>

关于不对称可见性有一些注意事项:

  • 只有声明了类型的属性才能有单独的set可见性。
  • set 可见性必须和 get 可见性相同或更严格。 也就是说,public protected(set)protected protected(set) 是允许的,但是 protected public(set) 会导致语法错误。
  • 如果一个属性是 public,那么主要可见性可能被省略。 也就是说,public private(set)private(set) 会有相同的结果。
  • 一个属性的 private(set) 可见性会自动变为 final, 并且不能在子类中重新声明。
  • 读取属性的引用遵循 set 可见性,而不是 get。 这是因为引用可能用于修改属性值。
  • 同样,试图写入数组属性会涉及到内部的 getset 操作, 因此会遵循 set 可见性,因为这总是更严格的。

注意: 设置访问控制时,声明中不允许有空格。private(set) 是正确的。private( set ) 是不正确的,将导致解析错误。

当一个类继承另一个类时,子类可以重新定义任何不是 final 的属性。 这样做时,可以扩大主要可见性或 set 可见性,只要新的可见性和父类相同或更宽。 但是要注意,如果一个 private 属性被重写,它实际上并没有改变父类的属性, 而是创建了一个具有不同内部名称的新属性。

示例 #3 不对称属性继承

<?php
class Book
{
protected
string $title;
public protected(
set) string $author;
protected private(
set) int $pubYear;
}

class
SpecialBook extends Book
{
public protected(
set) $title; // OK, as reading is wider and writing the same.
public string $author; // OK, as reading is the same and writing is wider.
public protected(set) int $pubYear; // Fatal Error. private(set) properties are final.
}
?>

方法的访问控制

类中的方法可以被定义为 public、private 或 protected。如果没有设置这些关键字,则该方法默认为 public。

示例 #4 方法声明

<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }

// 声明一个公有的方法
public function MyPublic() { }

// 声明一个受保护的方法
protected function MyProtected() { }

// 声明一个私有的方法
private function MyPrivate() { }

// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 这行会产生一个致命错误
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行

class Bar
{
public function
test() {
$this->testPrivate();
$this->testPublic();
}

public function
testPublic() {
echo
"Bar::testPublic\n";
}

private function
testPrivate() {
echo
"Bar::testPrivate\n";
}
}

class
Foo extends Bar
{
public function
testPublic() {
echo
"Foo::testPublic\n";
}

private function
testPrivate() {
echo
"Foo::testPrivate\n";
}
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

常量的控制访问

PHP 7.1.0 开始,类的常量可以定义为 public、private 或 protected。如果没有设置这些关键字,则该常量默认为 public。

示例 #5 PHP 7.1.0 中的常量声明

<?php
/**
* Define MyClass
*/
class MyClass
{
// 公有常量
public const MY_PUBLIC = 'public';

// 受保护的常量
protected const MY_PROTECTED = 'protected';

// 私有常量
private const MY_PRIVATE = 'private';

public function
foo()
{
echo
self::MY_PUBLIC;
echo
self::MY_PROTECTED;
echo
self::MY_PRIVATE;
}
}

$myclass = new MyClass();
MyClass::MY_PUBLIC; // 这行可以正常执行
MyClass::MY_PROTECTED; // 这行会产生一个致命错误
MyClass::MY_PRIVATE; // 这行会产生一个致命错误
$myclass->foo(); // 将会输出:Public Protected Private


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// This is public
function foo2()
{
echo
self::MY_PUBLIC;
echo
self::MY_PROTECTED;
echo
self::MY_PRIVATE; // 这行会产生一个致命错误
}
}

$myclass2 = new MyClass2;
echo
MyClass2::MY_PUBLIC; // 这行可以正常执行
$myclass2->foo2(); // 将会输出:Public Protected,MY_PRIVATE 是私有常量,无法输出
?>

其它对象的访问控制

同一个类的对象即使不是同一个实例也可以互相访问对方的 private 与 protected 成员。 这是由于在这些对象的内部具体实现的细节都是已知的。

示例 #6 访问同一个对象类型的 private 成员

<?php
class Test
{
private
$foo;

public function
__construct($foo)
{
$this->foo = $foo;
}

private function
bar()
{
echo
'Accessed the private method.';
}

public function
baz(Test $other)
{
// 我们可以改变 private 属性:
$other->foo = 'hello';
var_dump($other->foo);

// 我们也可以调用 private 方法:
$other->bar();
}
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

以上示例会输出:

string(5) "hello"
Accessed the private method.
添加备注

用户贡献的备注 6 notes

up
63
pgl at yoyo dot org
10 years ago
Just a quick note that it's possible to declare visibility for multiple properties at the same time, by separating them by commas.

eg:

<?php
class a
{
protected
$a, $b;

public
$c, $d;

private
$e, $f;
}
?>
up
10
Joshua Watt
18 years ago
I couldn't find this documented anywhere, but you can access protected and private member varaibles in different instance of the same class, just as you would expect

i.e.

<?php
class A
{
protected
$prot;
private
$priv;

public function
__construct($a, $b)
{
$this->prot = $a;
$this->priv = $b;
}

public function
print_other(A $other)
{
echo
$other->prot;
echo
$other->priv;
}
}

class
B extends A
{
}

$a = new A("a_protected", "a_private");
$other_a = new A("other_a_protected", "other_a_private");

$b = new B("b_protected", "ba_private");

$other_a->print_other($a); //echoes a_protected and a_private
$other_a->print_other($b); //echoes b_protected and ba_private

$b->print_other($a); //echoes a_protected and a_private
?>
up
10
jc dot flash at gmail dot com
13 years ago
if not overwritten, self::$foo in a subclass actually refers to parent's self::$foo
<?php
class one
{
protected static
$foo = "bar";
public function
change_foo($value)
{
self::$foo = $value;
}
}

class
two extends one
{
public function
tell_me()
{
echo
self::$foo;
}
}
$first = new one;
$second = new two;

$second->tell_me(); // bar
$first->change_foo("restaurant");
$second->tell_me(); // restaurant
?>
up
6
bishop at php dot net
8 years ago
> Members declared protected can be accessed only within
> the class itself and by inherited classes. Members declared
> as private may only be accessed by the class that defines
> the member.

This is not strictly true. Code outside the object can get and set private and protected members:

<?php
class Sealed { private $value = 'foo'; }

$sealed = new Sealed;
var_dump($sealed); // private $value => string(3) "foo"

call_user_func(\Closure::bind(
function () use (
$sealed) { $sealed->value = 'BAZ'; },
null,
$sealed
));

var_dump($sealed); // private $value => string(3) "BAZ"

?>

The magic lay in \Closure::bind, which allows an anonymous function to bind to a particular class scope. The documentation on \Closure::bind says:

> If an object is given, the type of the object will be used
> instead. This determines the visibility of protected and
> private methods of the bound object.

So, effectively, we're adding a run-time setter to $sealed, then calling that setter. This can be elaborated to generic functions that can force set and force get object members:

<?php
function force_set($object, $property, $value) {
call_user_func(\Closure::bind(
function () use (
$object, $property, $value) {
$object->{$property} = $value;
},
null,
$object
));
}

function
force_get($object, $property) {
return
call_user_func(\Closure::bind(
function () use (
$object, $property) {
return
$object->{$property};
},
null,
$object
));
}

force_set($sealed, 'value', 'quux');
var_dump(force_get($sealed, 'value')); // 'quux'

?>

You should probably not rely on this ability for production quality code, but having this ability for debugging and testing is handy.
up
2
alperenberatdurmus at gmail dot com
2 years ago
Dynamic properties are "public".
<?php
class MyClass {
public function
setProperty($value) {
$this->dynamicProperty = $value;
}
}
$obj = new MyClass();
$obj->setProperty('Hello World');
echo
$obj->dynamicProperty; // Outputs "Hello World"
?>

This usage is the same as well:
<?php
class MyClass {
}
$obj = new MyClass();
$obj->dynamicProperty = 'Hello World';
echo
$obj->dynamicProperty; // Outputs "Hello World"
?>
up
2
kostya at eltexsoft dot com
3 years ago
I see we can redeclare private properties into child class
<?php
class A{
private
int $private_prop = 4;
protected
int $protected_prop = 8;
}

class
B extends A{
private
int $private_prop = 7; // we can redeclare private property!!!
public function printAll() {
echo
$this->private_prop;
echo
$this->protected_prop;
}
}

$b = new B;
$b->printAll(); // show 78
}
?>
To Top
肺结核通过什么途径传染 农历十月初五是什么星座 竹节虫吃什么 鼻涕有血丝是什么原因 舔是什么意思
睚眦必报是什么意思 尿肌酐低是什么原因 钟表挂在客厅什么位置好 小孩疝气是什么症状 dl是什么单位
什么的仪式 木驴是什么 鱼露是什么 翎字五行属什么 一个月一个办念什么
91岁属什么 什么是冷暴力 女性潮热是什么症状 放化疗期间吃什么好 蜈蚣咬了用什么药
什么弟什么兄hcv9jop0ns6r.cn 牙套脸是什么样hcv8jop8ns0r.cn 睾丸疼痛吃什么药最好hcv8jop4ns5r.cn 雷替斯和优甲乐有什么区别hcv8jop9ns0r.cn 玛瑙是什么hcv9jop4ns0r.cn
总是耳鸣是什么原因hcv8jop3ns1r.cn 血离子是检查什么的1949doufunao.com 类风湿是什么原因引起的hcv7jop4ns8r.cn 什么是骨科hcv8jop7ns1r.cn 宝齐莱算什么档次的表hcv8jop3ns0r.cn
女人吃黄芪有什么好处hcv8jop4ns6r.cn 皮肤病是什么原因造成的onlinewuye.com 衣钵是什么意思bfb118.com 咳嗽咳到吐是什么原因hcv9jop0ns2r.cn 葡萄球菌是什么hcv9jop5ns0r.cn
咖啡色五行属什么hcv9jop6ns8r.cn 反洗钱是什么意思hcv8jop6ns9r.cn 非典型腺细胞是什么意思hcv8jop5ns4r.cn 黄历冲生肖是什么意思hcv7jop6ns6r.cn 多囊肾是什么意思520myf.com
百度