سؤال

كما نعلم ، فإن إنشاء كائنات مجهولة في جافا سكريبت أمر سهل ، مثل الكود أدناه:

var object = { 
    p : "value", 
    p1 : [ "john", "johnny" ] } ; 
alert(object.p1[1]) ;

الناتج:

an alert is raised with value "johnny"

يمكن تطبيق هذه التقنية نفسها في حالة بي إتش بي?يمكننا إنشاء كائنات مجهولة في بي إتش بي?

هل كانت مفيدة؟

المحلول

لقد مرت عدة سنوات ، لكنني أعتقد أنني بحاجة إلى تحديث المعلومات باستمرار!


في php-7 ، من الممكن إنشاء فئات مجهولة ، حتى تتمكن من القيام بأشياء مثل هذا: Genacodicetagpre

يمكنك قراءة المزيد حول هذا في RFC (مقبول): https://wiki.php.net/rfc/anonymous_classes

لكنني لا أعرف مدى تشابهها مع جافا سكريبت ، لذلك قد تكون هناك بعض الاختلافات بين الفئات المجهولة في جافا سكريبت و php.

تعديل:

بدءًا من التعليقات المنشورة ، ها هو رابط الدليل الآن: http:// php.net / manual / en / language.oop5.anonymous.php

نصائح أخرى

"مجهول" ليس المصطلح الصحيح عند الحديث عن الأشياء.سيكون من الأفضل أن نقول " كائن مجهول النوع"،ولكن هذا لا ينطبق على فب.

جميع الكائنات في فب لديها فئة.الفئة "الافتراضية" هي stdClass, ، ويمكنك إنشاء كائنات منه بهذه الطريقة:

$obj = new stdClass;
$obj->aProperty = 'value';

يمكنك أيضا الاستفادة من صب صفيف إلى كائن لبناء جملة أكثر ملاءمة:

$obj = (object)array('aProperty' => 'value');
print_r($obj);

ومع ذلك ، يرجى العلم أن صب صفيف إلى كائن من المرجح أن تسفر عن نتائج "مثيرة للاهتمام" لتلك المفاتيح صفيف التي ليست صالحة أسماء المتغيرات فب-على سبيل المثال, هنا إجابة لي توضح ما يحدث عندما تبدأ المفاتيح بالأرقام.

نعم ، هذا ممكن!باستخدام هذا بسيط كائن مجهول بي إتش بي صف دراسي.كيف يعمل:

// define by passing in constructor
$anonim_obj = new AnObj(array(
    "foo" => function() { echo "foo"; }, 
    "bar" => function($bar) { echo $bar; } 
));

$anonim_obj->foo(); // prints "foo"
$anonim_obj->bar("hello, world"); // prints "hello, world"

// define at runtime
$anonim_obj->zoo = function() { echo "zoo"; };
$anonim_obj->zoo(); // prints "zoo"

// mimic self 
$anonim_obj->prop = "abc";
$anonim_obj->propMethod = function() use($anonim_obj) {
    echo $anonim_obj->prop; 
};
$anonim_obj->propMethod(); // prints "abc"

بالطبع هذا الكائن هو مثال على AnObj الطبقة ، لذلك ليس مجهول حقا ، لكنه يجعل من الممكن لتحديد أساليب على الطاير ، مثل جافا سكريبت القيام به.

حتى وقت قريب كانت هذه هي الطريقة التي أنشأت بها الكائنات أثناء الطيران Genacodicetagpre

بعد ذلك: Genacodicetagpre

لكنني الآن أذهب مع: Genacodicetagpre

ثم كما كان من قبل: Genacodicetagpre

بالطبع إذا كنت تعرف بالفعل الخصائص والقيم يمكنك وضعها في الداخل كما تم ذكره: Genacodicetagpre

ملحوظة: لا أعرف أي إصدارات PHP يعمل عليها هذا ، لذا عليك أن تضع في اعتبارك ذلك.لكنني أعتقد أن النهج الأول (الذي يكون قصيرًا أيضًا إذا لم تكن هناك خصائص لتعيينها عند الإنشاء) يجب أن يعمل مع جميع الإصدارات التي تحتوي على json_encode / json_decode

إذا كنت ترغب في تقليد JavaScript ، فيمكنك إنشاء رمز علامة ترميز عام للفصل ، وبالتالي الحصول على نفس السلوك.بالطبع لم يعد هذا مجهول الهوية بعد الآن ، لكنه سيعمل. Genacodicetagpre

سيؤدي ذلك إلى إخراج العنصر 2 .تمت سرقة هذا من تعليق على PHP: Classes and Objects .

تحويل المصفوفة إلى كائن: Genacodicetagpre

إذا كنت تريد إنشاء كائن (كما هو الحال في جافا سكريبت) بخصائص ديناميكية ، دون تلقي تحذير بخاصية غير محددة ، عند عدم تعيين قيمة للخاصية Genacodicetagpre

هل يمكن تطبيق نفس التقنية في حالة PHP؟

لا - لأن جافا سكريبت تستخدم نماذج أولية / إعلان مباشر للكائنات - في PHP (والعديد من لغات OO الأخرى) ، لا يمكن إنشاء كائن إلا من فصل دراسي.

لذا يصبح السؤال - هل يمكنك إنشاء فصل دراسي مجهول

مرة أخرى ، الإجابة هي لا - كيف يمكنك إنشاء مثيل للفصل دون التمكن من الرجوع إليه؟

لمن يريد كائنًا تكراريًا: Genacodicetagpre

من وثائق PHP ، بعض الأمثلة الأخرى: Genacodicetagpre

obj1 $ و $ obj3 من نفس النوع ، لكن $ obj1!== $ obj3.أيضًا ، ستعمل الثلاثة جميعها json_encode () على كائن JS بسيط {}: Genacodicetagpre

المخرجات: Genacodicetagpre

https://www.php.net/manual/en/language.types.object.php

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top