jQuery 的 $.extend() 在 PHP 中有什么等價的嗎?
我想在不使用后期靜態系結的情況下,務實地將類與其他類及其屬性(包括方法)合并/組合/擴展。
class a {}
class b {}
class c {}
$merged = combine(new a(), new b(), new c());
這不是我要找的:
class a {}
class b extends a {}
$merged = new b();
uj5u.com熱心網友回復:
PHP 中沒有任何等效的東西,因為它們的物件系統非常不同。
JavaScript 不像 PHP 那樣有真正的類,它的物件系統是基于原型的。方法可以是實體的直接屬性,但如果沒有直接屬性,將搜索原型鏈以找到它。$.extend()自動將從原型繼承的屬性復制到目標物件,因此結果有點像所有原始類的子類的實體。
但是 PHP 沒有任何等同于將方法直接附加到物件的功能,因此combine()函式無法合并來自引數類的所有方法。物件是特定類的實體,它僅從類物件(及其超類)中獲取其方法。
uj5u.com熱心網友回復:
就像@Barmar 所說的,這在 PHP 中并不是真正的東西。變通方法很丑陋,但我將為想要大笑的人描述兩種丑陋的變通方法。??
解決方法 #1 - 通過在類中使用魔法方法來擴展類。優點是可以從一個合并的物件訪問屬性和方法。但在表面之下,它們并沒有真正合并。所以不鼓勵設定屬性,交叉訪問屬性是不行的。
class extend {
private $_objects;
private $_properties = [];
public function __construct(...$objects) {
$this->_objects = array_reverse($objects);
}
public function &__isset($name) {
return $this->__get($name);
}
public function __get($name) {
foreach ($this->_objects as $object) {
if (isset($object->$name)) {
return $object->$name;
}
}
if (isset($this->_properties[$name])) {
return $this->_properties[$name];
}
return null;
}
public function __set($name, $value) {
foreach ($this->_objects as $object) {
if (isset($object->$name)) {
$object->$name = $value;
return true;
}
}
$this->_properties[$name] = $value;
return true;
}
public function __call($name, $params) {
foreach ($this->_objects as $object) {
if (method_exists($object, $name)) {
call_user_func_array([$object, $name], $params);
}
}
return null;
}
}
示例物件:
class a {
var $fruit= 'apple';
function foo() { return 'a'; }
}
class b {
var $fruit = 'banana';
function bar() { return 'b'; }
}
合并示例:
$merged = new extend(new a(), new b());
echo $merged->foo();
echo $merged->bar();
$merged->this = 'that';
echo $merged->this;
解決方法 #2 - 使用匿名函式而不是方法合并物件使它們可移植和可合并。缺點是依賴它們可能被認為是不道德的或未來的安全風險。屬性中的匿名函式不能在類中定義,必須在__construct()中設定。并且將匿名函式作為屬性訪問會與呼叫常規方法的語法發生沖突。因此還需要呼叫語法的解決方法(PHP 7.0 )。
示例物件:
class a {
var $fruit = 'apple';
function __construct(){
$this->foo = function() { return 'a'; };
}
}
class b {
var $fruit = 'banana';
function __construct() {
$this->bar = function() { return 'b'; };
}
}
合并示例:
$merged = (object)array_merge(
get_object_vars(new a()),
get_object_vars(new b())
);
echo ($merged->foo)(); // $class->var() doesn't work for anonymous functions
echo ($merged->bar)();
$merged->fruit = 'orange';
echo $merged->fruit;
最終結論:肯定是非常規的,大多是丑陋的。??
使用后期靜態系結來擴展 PHP 類物件可能會更好。
class a {}
class b extends a {}
class c extends b {}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398922.html
上一篇:解密等效于opensslrsautl-decrypt-oaep-inkeyxx.pem-incyphertext.enc-outplaintex.txt
下一篇:如何僅在某些頁面上顯示頁腳按鈕?
