توابع متغیر
زبان پی اچ پی از مفهوم توابع متغیر (variable functions) نیز پشتیبانی می کند. این بدان معنی است که اگر یک نام متغیر دارای پرانتز باشد، پی اچ پی به دنبال یک تابع با نام مشابه می گردد تا متغیر را بر اساس آن ارزیابی نماید، و در نهایت تلاش می کند آن را اجرا کند. علاوه بر کارهای دیگر، از این ویژگی می توان برای اجرای callback، جداول تابع، و چیزهایی شبیه به آن استفاده کرد.
توابع متغیر با ساختارهای زبانی مانند echo, print, unset(), isset(), empty() include, require و چیزهایی شبیه به آن عمل نمی کنند. اگر می خواهید از هر کدام از این ساختار ها به عنوان توابع متغیر استفاده کنید، از توابع پوشش دهنده استفاده نمایید.
مثال اول: مثال تابع متغیر
<?php function foo() { echo "In foo()
\n"; } function bar($arg = '') { echo "In bar(); argument was '$arg'.
\n"; } // This is a wrapper function around echo function echoit($string) { echo $string; } $func = 'foo'; $func(); // This calls foo() $func = 'bar'; $func('test'); // This calls bar() $func = 'echoit'; $func('test'); // This calls echoit() ?>
متدهای شی را می توان در ساختار دستوری توابع متغیر فراخوانی کرد.
مثال دوم: مثال متد متغیر
<?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // This calls the Bar() method } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // This calls $foo->Variable() ?>
هنگامی که متدهای ایستا را فراخوانی می کنیم، فراخوانی این تابع از عملگر ویژگی ایستا (Static property) قوی تر است:
مثال سوم: مثال متد متغیر به همراه ویژگی ایستا
<?php class Foo { static $variable = 'static property'; static function Variable() { echo 'Method Variable called'; } } echo Foo::$variable; // This prints 'static property'. It does need a $variable in this scope. $variable = "Variable"; Foo::$variable(); // This calls $foo->Variable() reading $variable in this scope. ?>