الدوال المتغيّرة في PHP
تدعم PHP مفهوم الدوال المتغيّرة والذي يعني أنّه في حال إلحاق قوسين إلى نهاية اسم أحد المتغيّرات، فإنّ اللغة ستبحث عن دالة تحمل الاسم ذاته، وستحاول تنفيذها. يمكن الاستفادة من هذه الميزة في الاستدعاءات الخلفية callbacks، وجداول الدوال وما إلى ذلك.
لا تعمل الدوال المتغيرة مع البنى التابعة للغة مثل echo
و print
و unset()
و isset()
و empty()
و include
و require
وما شابهها، ولاستخدام أيّ من هذه الدوال كدوال متغيرة يمكن الاستعانة بدوالّ تغليف.
المثال 1: مثال على الدوال المتغيرة
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// مثال على دالة تغليف
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()
?>
يمكن استدعاء توابع الكائنات بنفس الصيغة المتبعة لاستدعاء الدوال المتغيرة.
المثال 2: مثال على تابع متغيّر
<?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:
المثال 3: مثال عن تابع متغيّر مع خاصية ساكنة
<?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.
?>
أصبح بالإمكان منذ الإصدار 5.4.0 من اللغة استدعاء أي قيمة قابلة للاستدعاء ومخزَّنة في متغير.
المثال 4: قيم معقدة قابلة للاستدعاء
<?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(); // prints "bar" as of PHP 7.0.0; prior, it raised a fatal error
?>
راجع أيضًا is_callable()
و call_user_func()
والمتغيرات المتغيرة و function_exists()
.
سجل التغييرات
الإصدار | الوصف |
---|---|
7.0.0 | أصبح بالإمكان استخدام الصيغة "ClassName::methodName" كدالة متغيرة. |
5.4.0 | أصبح بالإمكان استخدام المصفوفات - وهي قابلة للاستدعاء - كدوال متغيرة. |