, ben başka fonksiyona this
bağlamak ve .call
veya PHP
.apply
ile çağırabilirsiniz JavaScript çağrısı gibi thisArg bağlamak call_user_func işlev?
JavaScript:
function greet() {
alert('Hello ' + this.name);
}
function SomeClass() {}
SomeClass.prototype = {
name: 'John',
test: function() {
greet.call(this);
}
}
var me = new SomeClass();
me.test(); // Hello John
PHP:
GÜNCELLEMEfunction greet() {
echo 'Hello ' . $this->name;
}
class SomeClass {
public $name = 'John';
function test() {
call_user_func('greet');
}
}
$me = new SomeClass;
$me->test(); // Fatal error: Using $this when not in object context
:
Teşekkür Reflection
fikir için @deceze, ben bu çözümleri bulduk ama sanmıyorum bu iyidir performans için (doğrudan çağrıdan x10 daha yavaş), fakat okumada çok net.
// See also Javascript: Function.prototype.apply()
function function_apply($fn, $thisArg, $argsArray = array()) {
static $registry;
if (is_string($fn)) {
if (!isset($registry[$fn])) {
$ref = new \ReflectionFunction($fn);
$registry[$fn] = $ref->getClosure();
}
$fn = $registry[$fn];
}
return call_user_func_array($fn->bindTo($thisArg), $argsArray);
}
// See also Javascript: Function.prototype.call()
function function_call($fn, $thisArg /*, arg1, arg2 ... */) {
return function_apply($fn, $thisArg, array_slice(func_get_args(), 2));
}
ve call_user_func
function_call
için değiştirin:
function greet() {
echo 'Hello ' . $this->name;
}
class SomeClass {
public $name = 'John';
function test() {
function_call('greet', $this);
}
}
$me = new SomeClass;
$me->test(); // Hello John
neden Neden o işlevine argüman katmayan ve bağımsız değişken olarak değişken geçirebilirsiniz ? Aksi takdirde 'use' anahtar kelimesi size yardımcı olabilir. (http://php.net/functions.anonymous) Ama emin değilim. –
http://stackoverflow.com/questions/27014664/php-equivalent-of-javascript-bind – haim770
'un olası kopyasının, bu argümanı "$ $" olarak değiştiren bir çözüm olduğunu bildiğim gibi, sadece merak ettiğim gibi çalışan Javascript – user1542316