الفرق بين المراجعتين لصفحة: «PHP/callable»

من موسوعة حسوب
< PHP
ط استبدال النص - 'PHP\/([^|-]*)-([^|-]*)' ب'PHP/$1_$2'
تعديلات طفيفة
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:ردود النداء في PHP}}</noinclude>
<noinclude>{{DISPLAYTITLE:ردود النداء في PHP}}</noinclude>
يمكن أن الإشارة إلى رد النداء (Callbacks) باستخدام نوع البيانات (callable) منذ إصدار PHP 5.4، هذا التوثيق يستخدم معلومات نوع callback لنفس الغرض.
يمكن الإشارة إلى رد النداء (Callbacks) باستخدام نوع البيانات (callable) منذ إصدار PHP 5.4، هذا التوثيق يستخدم معلومات نوع callback لنفس الغرض.


بعض الدوال مثل <code>[[PHP/call_user_func|call_user_func()‎]]</code> أو <code>[[PHP/usort|usort()‎]]</code> تقبل فقط دوال رد النداء المعرّفة من قبل المستخدم (user-defined callback functions) كمعامل.
بعض الدوال مثل <code>[[PHP/call_user_func|call_user_func()‎]]</code> أو <code>[[PHP/usort|usort()‎]]</code> تقبل فقط دوال رد النداء المعرّفة من قبل المستخدم (user-defined callback functions) كمعامل.


دوال رد النداء ليست دوالًا بسيطًا فحسب، بل يمكن استخدام الدوال التي تكون أعضاءً في أصناف (object methods)، بما في ذلك الدوال الساكنة (static class methods).
دوال رد النداء ليست دوالًا بسيطةً فحسب، بل يمكن استخدام الدوال التي تكون أعضاءً في أصناف (object methods)، بما في ذلك الدوال الساكنة (static class methods).
== تمرير دوال رد النداء ==
== تمرير دوال رد النداء ==
يتم تمرير أي دالة PHP باستخدام اسمها كسلسلة نصية، ويمكن استخدام أي دالة معرّفة من قبل المستخدم (user-defined)، باستثناء الدوال البنيوية في اللغة مثل: <code>[[PHP/echo|echo]]</code> أو <code>[[PHP/array|array()‎]]</code> أو <code>[[PHP/empty|empty()‎]]</code> أو <code>[[PHP/eval|eval()‎]]</code> أو <code>[[PHP/exit|exit()‎]]</code> أو <code>[[PHP/isset|isset()‎]]</code> أو <code>[[PHP/list|list()‎]]</code> أو <code>[[PHP/print|print]]</code> أو <code>[[PHP/unset|unset()‎]]</code>.  
يتم تمرير أي دالة PHP باستخدام اسمها كسلسلة نصية، ويمكن استخدام أي دالة معرّفة من قبل المستخدم (user-defined)، باستثناء الدوال البنيوية في اللغة مثل: <code>[[PHP/echo|echo]]</code> أو <code>[[PHP/array|array()‎]]</code> أو <code>[[PHP/empty|empty()‎]]</code> أو <code>[[PHP/eval|eval()‎]]</code> أو <code>[[PHP/exit|exit()‎]]</code> أو <code>[[PHP/isset|isset()‎]]</code> أو <code>[[PHP/list|list()‎]]</code> أو <code>[[PHP/print|print]]</code> أو <code>[[PHP/unset|unset()‎]]</code>.  
سطر 12: سطر 12:
يمكن أيضًا تمرير الدوال الساكنة (static methods) دون تهيئة كائن من ذلك الصنف، عبر تمرير اسم الصنف بدلًا من الكائن في الفهرس <code>0</code>، وأصبح بالإمكان بدءًا من الإصدار 5.2.3 من PHP استعمال الصيغة <code>'ClassName::methodName'</code> أي <code>"اسم الصنف::اسم الأسلوب"</code>.
يمكن أيضًا تمرير الدوال الساكنة (static methods) دون تهيئة كائن من ذلك الصنف، عبر تمرير اسم الصنف بدلًا من الكائن في الفهرس <code>0</code>، وأصبح بالإمكان بدءًا من الإصدار 5.2.3 من PHP استعمال الصيغة <code>'ClassName::methodName'</code> أي <code>"اسم الصنف::اسم الأسلوب"</code>.


وبغض النظر عن الدوال الشائعة التي يُعرِّفها المستخدم، يمكن تمرير أيضا الدوال المجهولة إلى كوسيط لرد النداء (callback).
وبغض النظر عن الدوال الشائعة التي يُعرِّفها المستخدم، يمكن تمرير أيضا الدوال المجهولة كوسيط لرد النداء (callback).
=== مثال 1: أمثلة عن أنواع دالة رد النداء ===
 
<syntaxhighlight lang="php">
مثال 1: أمثلة عن أنواع دالة رد النداء<syntaxhighlight lang="php">
<?php
<?php


سطر 70: سطر 70:
call_user_func($c, 'PHP!');
call_user_func($c, 'PHP!');
?>  
?>  
</syntaxhighlight>
</syntaxhighlight>مثال 2: مثال رد نداء باستخدام تعبير مغلق (closure)<syntaxhighlight lang="php">
 
=== مثال 2: مثال رد نداء باستخدام تعبير مغلق (closure) ===
<syntaxhighlight lang="php">
<?php
<?php
// التعبير المغلق
// التعبير المغلق

المراجعة الحالية بتاريخ 16:35، 5 يونيو 2018

يمكن الإشارة إلى رد النداء (Callbacks) باستخدام نوع البيانات (callable) منذ إصدار PHP 5.4، هذا التوثيق يستخدم معلومات نوع callback لنفس الغرض.

بعض الدوال مثل call_user_func()‎ أو usort()‎ تقبل فقط دوال رد النداء المعرّفة من قبل المستخدم (user-defined callback functions) كمعامل.

دوال رد النداء ليست دوالًا بسيطةً فحسب، بل يمكن استخدام الدوال التي تكون أعضاءً في أصناف (object methods)، بما في ذلك الدوال الساكنة (static class methods).

تمرير دوال رد النداء

يتم تمرير أي دالة PHP باستخدام اسمها كسلسلة نصية، ويمكن استخدام أي دالة معرّفة من قبل المستخدم (user-defined)، باستثناء الدوال البنيوية في اللغة مثل: echo أو array()‎ أو empty()‎ أو eval()‎ أو exit()‎ أو isset()‎ أو list()‎ أو print أو unset()‎.

تُمرَّر دالةٌ تابعةٌ لكائنٍ كمصفوفةٍ تحتوي على كائن في الفهرس 0 والدالة في الفهرس 1، ويسمح بالوصول إلى الدوال المحمية (protected) والخاصة (private) من داخل الصنف (class).

يمكن أيضًا تمرير الدوال الساكنة (static methods) دون تهيئة كائن من ذلك الصنف، عبر تمرير اسم الصنف بدلًا من الكائن في الفهرس 0، وأصبح بالإمكان بدءًا من الإصدار 5.2.3 من PHP استعمال الصيغة 'ClassName::methodName' أي "اسم الصنف::اسم الأسلوب".

وبغض النظر عن الدوال الشائعة التي يُعرِّفها المستخدم، يمكن تمرير أيضا الدوال المجهولة كوسيط لرد النداء (callback).

مثال 1: أمثلة عن أنواع دالة رد النداء

<?php

// مثال عن دالة رد النداء
function my_callback_function() {
    echo 'hello world!';
}

// مثال عن دالة رد نداء ساكنة داخل صنف
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// النوع 1: رد نداء بسيط
call_user_func('my_callback_function');

// النوع 2: رد نداء لدالة ساكنة ضمن صنف
call_user_func(array('MyClass', 'myCallbackMethod'));

// النوع 3: رد نداء لدالة ضمن صنف
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// النوع 4: صيغة أخرى لرد نداء لدالة ساكنة ضمن صنف
call_user_func('MyClass::myCallbackMethod');

// النوع 5: صيغة نسبية لرد نداء دالة ساكنة
class {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A

// النوع 6: الكائنات التي فيها الدالة
// __invoke()
// يمكن أن تستخدم رد النداء
// PHP 5.3
class {
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');
?>

مثال 2: مثال رد نداء باستخدام تعبير مغلق (closure)

<?php
// التعبير المغلق
$double = function($a) {
    return $a * 2;
};

// مجال الأرقام
$numbers = range(1, 5);

// استخدام التعبير المغلق هنا
// لمضاعفة كل عنصر في 
// المجال
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
?>

مخرجات المثال السابق هي:

2 4 6 8 10

ملاحظة: لن تستدعى ردود النداءات المسجلة مع الدوال مثل call_user_func()‎ و call_user_func_array()‎ إذا كان هنالك استثناء غير معالج تم رميه في الاستدعاء السابق.

مصادر