Php में अनाम ऑब्जेक्ट बनाना


141

जैसा कि हम जानते हैं, जावास्क्रिप्ट में अनाम वस्तुओं को बनाना आसान है, जैसे नीचे दिए गए कोड:

var object = { 
    p : "value", 
    p1 : [ "john", "johnny" ]
};

alert(object.p1[1]);

आउटपुट:

an alert is raised with value "johnny"

क्या यह वही तकनीक PHP में लागू की जा सकती है? क्या हम PHP में अनाम ऑब्जेक्ट बना सकते हैं?


1
नोट: यह एक पुराना प्रश्न है, इसलिए स्वीकृत उत्तर पुराना है। इस सुविधा के लिए कहा जा रहा है अब PHP 7 में जोड़ा गया है। @ Rizier123 द्वारा नीचे दिए गए उत्तर को देखें।
सिम्बा

@ सिंबा - इसे इंगित करने के लिए धन्यवाद। क्या आप भविष्य के आगंतुकों की मदद करने के लिए इस पृष्ठ पर यहाँ StackOverflow पर उत्तर पोस्ट करना चाहेंगे?
सुजीत अग्रवाल 5

1
मुझे जरूरत नहीं है; इस जानकारी के साथ पहले से ही एक उत्तर है (नीचे देखें, @ Rizier123 द्वारा)।
सिम्बा

जवाबों:


40

कुछ साल हो गए हैं, लेकिन मुझे लगता है कि मुझे जानकारी को अद्यतन रखने की आवश्यकता है!

PHP 7 के बाद से अनाम कक्षाएं बनाना संभव हो गया है, इसलिए आप इस तरह की चीजें करने में सक्षम हैं:

<?php

    class Foo {}
    $child = new class extends Foo {};

    var_dump($child instanceof Foo); // true

?>

आप मैनुअल में इसके बारे में अधिक पढ़ सकते हैं

लेकिन मुझे नहीं पता कि यह जावास्क्रिप्ट के समान कैसे लागू होता है, इसलिए जावास्क्रिप्ट और PHP में अनाम कक्षाओं के बीच कुछ अंतर हो सकते हैं।


@risyasin धन्यवाद, जवाब अपडेट किया और इसमें मैनुअल लिंक डाल दिया।
रिज़ियर १२

Php7 में नवीनतम परिवर्तनों के साथ रखने के लिए अपने उत्तर को सही के रूप में चिह्नित करना। धन्यवाद @ Rizier123
सुजीत अग्रवाल

3
यह दिलचस्प है, लेकिन यह वास्तव में प्रश्न को संबोधित नहीं करता है, क्योंकि ओपी एक वर्ग बनाने के बिना विभिन्न सदस्यों के साथ एक वस्तु को इनिशियलाइज़ करने के लिए एक सुविधाजनक तरीके के बारे में पूछ रहा था। मुझे यकीन नहीं है कि php में अनाम कक्षाओं का उपयोग करने के लिए किया जा सकता है या नहीं, और यदि यह हो सकता है, तो आपने यह नहीं बताया कि कैसे।
amh15

228

"अनाम" वस्तुओं के बारे में बात करते समय सही शब्दावली नहीं है। इसे "गुमनाम प्रकार की वस्तु" कहना बेहतर होगा , लेकिन यह PHP पर लागू नहीं होता है।

PHP में सभी वस्तुओं का एक वर्ग होता है। "डिफ़ॉल्ट" वर्ग है stdClass, और आप इसे इस तरह से बना सकते हैं:

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

आप किसी ऑब्जेक्ट को किसी अधिक सुविधाजनक सिंटैक्स के लिए किसी सरणी को कास्टिंग करने का भी लाभ उठा सकते हैं :

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

हालांकि, यह सलाह दी जाती है कि किसी ऑब्जेक्ट को किसी सरणी में डालने से उन सरणी कुंजियों के लिए "रोचक" परिणाम प्राप्त होने की संभावना है, जो मान्य PHP चर नाम नहीं हैं - उदाहरण के लिए, यहां मेरा एक जवाब है जो दिखाता है कि क्या होता है जब अंक अंकों से शुरू होते हैं।


1
मैं कई मूल्यवान सरणी भी धक्का कर सकते हैं?
सुजीत अग्रवाल

2
@ कोडिंगफ़्रीक: आप कर सकते हैं, लेकिन : यदि सरणी में उप-सरणियाँ हैं और आप उन वस्तुओं को भी चाहते हैं, तो आपको हर एक को स्पष्ट रूप से ऑब्जेक्ट करने की आवश्यकता होगी।
जॉन

21

हाँ यह संभव है! इस सरल PHP बेनामी वस्तु वर्ग का उपयोग करना । यह काम किस प्रकार करता है:

// 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क्लास का एक उदाहरण है , इसलिए यह वास्तव में गुमनाम नहीं है, लेकिन यह जावास्क्रिप्ट पर मक्खी की तरह तरीकों को परिभाषित करना संभव बनाता है।


अनाम फ़ंक्शन का अनुकरण करने के लिए आप create_function का उपयोग कर सकते हैं ।
मिहेलऑफ

मुझे लगता है कि वह बस कुछ मूल्यों के साथ एक stdClass ऑब्जेक्ट को इनिशियलाइज़ करने का एक साफ तरीका चाहता था। क्या आप अपने दृष्टिकोण के साथ ऐसा कर सकते हैं?
अमह 15

18

हाल ही में जब तक यह नहीं है कि मैंने कैसे मक्खी पर वस्तुओं का निर्माण किया।

$someObj = json_decode("{}");

फिर:

$someObj->someProperty = someValue;

लेकिन अब मैं इसके साथ जाता हूं:

$someObj = (object)[];

फिर पहले की तरह:

$someObj->someProperty = someValue;

यदि आप पहले से ही उन गुणों और मूल्यों को जानते हैं, जिन्हें आप उनके अंदर सेट कर सकते हैं, जैसा कि उल्लेख किया गया है:

$someObj = (object)['prop1' => 'value1','prop2' => 'value2'];

NB: मुझे नहीं पता कि PHP के कौन से संस्करण इस पर काम करते हैं, इसलिए आपको उस पर ध्यान देने की आवश्यकता होगी। लेकिन मुझे लगता है कि पहला दृष्टिकोण (जो भी कम है अगर निर्माण पर सेट करने के लिए कोई गुण नहीं हैं) को उन सभी संस्करणों के लिए काम करना चाहिए जिनके पास json_encode / json_decode है


1
यह कैसे $ someObj = new \ stdClass () से अलग है?
जेम्सएनएन

9

सरणी को ऑब्जेक्ट में बदलें (लेकिन यह उप-चिल्ड के लिए पुनरावर्ती नहीं है):

$obj = (object)  ['myProp' => 'myVal'];

7

यदि आप जावास्क्रिप्ट की नकल करना चाहते हैं, तो आप एक वर्ग बना सकते हैं Object, और इस तरह एक ही व्यवहार प्राप्त कर सकते हैं । बेशक यह अब और अधिक गुमनाम नहीं है, लेकिन यह काम करेगा।

<?php 
class Object { 
    function __construct( ) { 
        $n = func_num_args( ) ; 
        for ( $i = 0 ; $i < $n ; $i += 2 ) { 
            $this->{func_get_arg($i)} = func_get_arg($i + 1) ; 
        } 
    } 
} 

$o = new Object( 
    'aProperty', 'value', 
    'anotherProperty', array('element 1', 'element 2')) ; 
echo $o->anotherProperty[1];
?>

यह तत्व 2 को आउटपुट करेगा । यह PHP: क्लासेस और ऑब्जेक्ट्स पर एक टिप्पणी से चुराया गया था ।


3

PHP 7.0 के बाद से अनाम कक्षाओं के लिए समर्थन उपलब्ध है, और सवाल में प्रदान की गई जावास्क्रिप्ट उदाहरण के लिए निकटतम एनालॉग है।

<?php
$object = new class {
    var $p = "value";
    var $p1 = ["john", "johnny"];
};

echo $object->p1[1];

गुणों पर दृश्यता की घोषणा को छोड़ा नहीं जा सकता है (मैंने सिर्फ varइसलिए इस्तेमाल किया क्योंकि यह इससे छोटा है public)

जावास्क्रिप्ट की तरह, आप क्लास के लिए तरीके भी परिभाषित कर सकते हैं:

<?php
$object = new class {
    var $p = "value";
    var $p1 = ["john", "johnny"];
    function foo() {return $this->p;}
};

echo $object->foo();

1

PHP प्रलेखन से, कुछ और उदाहरण:

<?php

$obj1 = new \stdClass; // Instantiate stdClass object
$obj2 = new class{}; // Instantiate anonymous class
$obj3 = (object)[]; // Cast empty array to object

var_dump($obj1); // object(stdClass)#1 (0) {}
var_dump($obj2); // object(class@anonymous)#2 (0) {}
var_dump($obj3); // object(stdClass)#3 (0) {}

?>

$ obj1 और $ obj3 एक ही प्रकार हैं, लेकिन $ obj1! == $ obj3। इसके अलावा, सभी तीन एक सरल जेएस वस्तु {} के लिए json_encode () होगा:

<?php

echo json_encode([
    new \stdClass,
    new class{},
    (object)[],
]);

?>

आउटपुट:

[{},{},{}]

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


0

यदि आप अपरिभाषित संपत्ति की चेतावनी प्राप्त किए बिना, गतिशील गुणों के साथ ऑब्जेक्ट (जैसे जावास्क्रिप्ट) बनाना चाहते हैं, जब आपने संपत्ति के लिए मूल्य निर्धारित नहीं किया है

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null

0

क्या PHP के मामले में भी यही तकनीक लागू की जा सकती है?

नहीं - क्योंकि जावास्क्रिप्ट में वस्तुओं के प्रोटोटाइप / प्रत्यक्ष घोषणा का उपयोग किया जाता है - PHP में (और कई अन्य ओओ भाषाओं में) एक वस्तु केवल एक वर्ग से बनाई जा सकती है।

तो सवाल बन जाता है - क्या आप एक अनाम वर्ग बना सकते हैं।

फिर से जवाब नहीं है - आप इसे संदर्भित करने में सक्षम होने के बिना कक्षा को कैसे त्वरित करेंगे?


अनाम वर्ग का उदाहरण बनाने के लिए आपको नाम की आवश्यकता नहीं है। Java: Object var = new Object() { ... };- C ++:class { ... } var;
TheOperator

1
आप अब PHP में अनाम कक्षाएं बना सकते हैं।
विक्टर


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.