Değişken işlevler

PHP değişken işlev kavramını desteklemektedir. Yani, bir değişken isminin sonuna parantez eklenmişse, PHP aynı isimde bir işlev olup olmadığına bakar ve bulduğu takdirde bu işlevi çalıştırmaya çalışır. Başka olası işlemlerin yanında, bu özellik geri çağırımların, işlev tablolarının ve benzerlerinin gerçeklenmesinde kullanılabilir.

Değişken işlevler, echo, print, unset(), isset(), empty(), include, require ve benzeri dil yapılarında çalışmayacaktır. Bu yapıları değişken işlev olarak kullanmak istediğiniz takdirde, gerekli sarmalayıcı işlevleri kendiniz yazmalısınız.

Örnek 1 - Değişken işlev örneği

<?php
function foo() {
    echo 
"In foo()<br />\n";
}

function 
bar($arg '')
{
    echo 
"In bar(); argument was '$arg'.<br />\n";
}

// Bu echo için sarmalayıcı işlevdir
function echoit($string)
{
    echo 
$string;
}

$func 'foo';
$func();        // foo() çağrılır

$func 'bar';
$func('test');  // bar() çağrılır

$func 'echoit';
$func('test');  // echoit() çağrılır
?>

Değişken işlev özelliğini kullanarak bir nesnenin bir yöntemini de çağırabilmeniz mümkündür.

Örnek 2 - Değişken yöntem örneği

<?php
class Foo
{
    function 
Variable()
    {
        
$name 'Bar';
        
$this->$name(); // Bu Bar() yöntemini çağıracaktır
    
}

    function 
Bar()
    {
        echo 
"Bu bir Bar";
    }
}

$foo = new Foo();
$funcname "Variable";
$foo->$funcname();  // Bu $foo->Variable() işlevini çağıracaktır

?>

Static türünden yöntemleri çağırırken işlev çağrısı 'static property' işlecinden daha güçlüdür:

Örnek 3 Duruk özellikli yöntem çağrısı örneği

<?php
class Foo
{
    static 
$variable 'static property';
    static function 
Variable()
    {
        echo 
'Method Variable called';
    }
}

echo 
Foo::$variable// Bu 'static property' basar. Bu bağlamda $variable gerekmez.
$variable "Variable";
Foo::$variable();  // Bu bağlamda $variable değişkenini okuyan $foo->Variable() çağrılır.

?>

PHP 5.4.0'dan itibaren bir değişkene saklanmış callable türünde bir işlevi çağırabilirsiniz.

Örnek 4 Karmaşık çağrılar

<?php
class Foo
{
    static function 
bar()
    {
        echo 
"bar\n";
    }
    function 
baz()
    {
        echo 
"baz\n";
    }
}

$func = array("Foo""bar");
$func(); // prints "bar"
$func = array(new Foo"baz");
$func(); // prints "baz"
$func "Foo::bar";;
$func(); // PHP 7.0.0 öncesinde "bar" basar ve ölümcül hata üretirdi
?>

Ayrıca bakınız: is_callable(), call_user_func(), değişken değişkenleri ve function_exists().

Sürüm Bilgisi

Sürüm: Açıklama
7.0.0 'SınıfAdı::yöntemAdı' bir değişken ismi olabilir.
5.4.0 Diziler de değişken işlev olabilir.

add a note add a note

User Contributed Notes 3 notes

up
9
Anonymous
7 years ago
$ wget http://www.php.net/get/php_manual_en.tar.gz/from/a/mirror
$ grep -l "\$\.\.\." php-chunked-xhtml/function.*.html

List of functions that accept variable arguments.
<?php
array_diff_assoc
()
array_diff_key()
array_diff_uassoc()
array()
array_intersect_ukey()
array_map()
array_merge()
array_merge_recursive()
array_multisort()
array_push()
array_replace()
array_replace_recursive()
array_unshift()
call_user_func()
call_user_method()
compact()
dba_open()
dba_popen()
echo()
forward_static_call()
fprintf()
fscanf()
httprequestpool_construct()
ibase_execute()
ibase_set_event_handler()
ibase_wait_event()
isset()
list()
maxdb_stmt_bind_param()
maxdb_stmt_bind_result()
mb_convert_variables()
newt_checkbox_tree_add_item()
newt_grid_h_close_stacked()
newt_grid_h_stacked()
newt_grid_v_close_stacked()
newt_grid_v_stacked()
newt_win_choice()
newt_win_entries()
newt_win_menu()
newt_win_message()
newt_win_ternary()
pack()
printf()
register_shutdown_function()
register_tick_function()
session_register()
setlocale()
sprintf()
sscanf()
unset()
var_dump()
w32api_deftype()
w32api_init_dtype()
w32api_invoke_function()
wddx_add_vars()
wddx_serialize_vars()
?>
up
-11
boards at gmail dot com
12 years ago
If you want to call a static function (PHP5) in a variable method:

Make an array of two entries where the 0th entry is the name of the class to be invoked ('self' and 'parent' work as well) and the 1st entry is the name of the function.  Basically, a 'callback' variable is either a string (the name of the function) or an array (0 => 'className', 1 => 'functionName').

Then, to call that function, you can use either call_user_func() or call_user_func_array().  Examples:

<?php
class A {

  protected
$a;
  protected
$c;

  function
__construct() {
   
$this->a = array('self', 'a');
   
$this->c = array('self', 'c');
  }

  static function
a($name, &$value) {
    echo
$name,' => ',$value++,"\n";
  }

  function
b($name, &$value) {
   
call_user_func_array($this->a, array($name, &$value));
  }

  static function
c($str) {
    echo
$str,"\n";
  }

  function
d() {
   
call_user_func_array($this->c, func_get_args());
  }

  function
e() {
   
call_user_func($this->c, func_get_arg(0));
  }

}

class
B extends A {

  function
__construct() {
   
$this->a = array('parent', 'a');
   
$this->c = array('self', 'c');
  }

  static function
c() {
   
print_r(func_get_args());
  }

  function
d() {
   
call_user_func_array($this->c, func_get_args());
  }

  function
e() {
   
call_user_func($this->c, func_get_args());
  }

}

$a =& new A;
$b =& new B;
$i = 0;

A::a('index', $i);
$a->b('index', $i);

$a->c('string');
$a->d('string');
$a->e('string');

# etc.
?>
up
-9
josh at joshstroup dot xyz
2 years ago
A small, but helpful note. If you are trying to call a static function from a different namespace, you must use the fully qualified namespace, even if they have the same top level namespace(s). For example if you have the following class to call:

<?php
namespace Project\TestClass;
class
Test {
    static function
funcToCall() {
        return
"test";
    }
}
?>
You must call it as:
<?php
namespace Project\OtherTestClass;
class
OtherTest {
    static function
callOtherFunc() {
       
$func = '\Project\TestClass::funcToCall';
       
$func();
    }
}
?>
and not:
<?php
class OtherTest {
    static function
callOtherFunc() {
       
$func = 'TestClass::funcToCall';
       
$func();
    }
}
?>
To Top