php 給 私有屬性賦值的 方法

2021-08-21 09:49:29 字數 1629 閱讀 3674

今天在看 composer 自動載入的原理的時候看見了乙個 給例項化物件的私有屬性賦值的操作,特此記錄一下

一般我們都知道,在類的外部是沒有辦法為類的私有屬性賦值或者改變私有屬性的值的。如:

<?php

class

animal

echo (new animal)->$dog; //報錯

但是如果真的要想為animal的物件例項的私有屬性重新賦值【當然改變私有屬性的值的情況很少見,說起看來這有一點點hack的意味了】,可以利用php的閉包來實現。

實現的demo

<?php

class

animal

$animal = new animal;

/* * 獲取animal類靜態私有成員屬性

*/$cat = static

function

() ;

/* * 獲取animal例項私有成員屬性

*/$dog = function

() ;

/* * 獲取animal例項公有成員屬性

*/$newdog = function

() ;

/** * bind函式:

* 引數1($closure) : 表示閉包函式

* 引數2($newthis): 你把這個匿名的方法是否放在乙個例項中,如果放在例項中,這個引數就是乙個例項,如果不放在例項中,那就放null。當你不放在例項中,也就是不存在$this。也就不能用$this(經試驗 為null時僅可呼叫 static 的變數)

* 引數3($newscope): 相當於類和例項呼叫的區別,函式的作用域, 傳類表示靜態呼叫方式,內部可以「類名::屬性」的方式使用;例項表示例項呼叫方式,內部可以「->」

*/$bindcat = closure::bind($cat, null, new animal());// 給閉包繫結了animal例項的作用域,但未給閉包繫結$this物件

$binddog = closure::bind(function

()use

($animal), null, 'animal');

$bindnewdog = closure::bind($newdog, $animal, $animal);// 將animal例項物件作為$this物件繫結給閉包,保留閉包原有作用域

echo

$bindcat(),'

';// 根據繫結規則,允許閉包通過作用域限定操作符獲取animal類靜態私有成員屬性

echo

$binddog(),'

';// 根據繫結規則,允許閉包通過繫結的$this物件(animal例項物件)獲取animal例項私有成員屬性

echo

$bindnewdog(),'

';// 根據繫結規則,允許閉包通過繫結的$this物件獲取animal例項公有成員屬性

這裡改變例項物件的私有屬性值的要點是將例項物件通過function() user (){}的方式來把它引入到閉包中,因為閉包已經處於animal(或說是例項物件)的作用域中,所以就可以訪問他私有屬性的值了

關於php閉包的bind函式的更多細節,可以參考一下這篇文章

php給陣列賦值的例項方法

陣列就是乙個鍵值對組成的語言結構,鍵類似於酒店的房間號,值類似於酒店房間裡儲存的東西。如果你去某個酒店住店,服務員會告訴你房間號是多少,具體房間裡有儲存了什麼,那就需要根據房間號進到房間裡才知道了。php 設定某個變數為乙個空陣列 arr array optesvdzfo php有兩種陣列 索引陣列...

Spring給屬性賦值

在spring中,我們給屬性賦值一般使用 value註解。按功能分可以將 value分為三類 value 張三 private string name value private int age 這裡賦值18 value private string clname cname.properties ...

C 屬性 賦值私有字段

c 屬性 賦值私有字段 為類中欄位手寫get方法和set方法很麻煩,所以程式幫我們自動的封裝出這個兩個方法 屬性 屬性是這樣的成員 它提供靈活的機制來讀取 編寫或計算某個私有欄位的值。可以像使用公共資料成員一樣使用屬性,但實際上它們是稱作 訪問器 的特殊方法。這使得可以輕鬆訪問資料,此外還有助於提高...