পিএইচপি-তে বেনামে অবজেক্ট তৈরি করা হচ্ছে


141

যেমনটি আমরা জানি, জাভাস্ক্রিপ্টে বেনামী অবজেক্ট তৈরি করা নীচের কোডের মতো সহজ:

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

alert(object.p1[1]);

আউটপুট:

an alert is raised with value "johnny"

এই একই কৌশল পিএইচপি প্রয়োগ করা যেতে পারে? আমরা কি পিএইচপি-তে বেনামে অবজেক্ট তৈরি করতে পারি?


1
দ্রষ্টব্য: এটি একটি পুরাতন প্রশ্ন, সুতরাং গৃহীত উত্তরগুলি পুরানো। জিজ্ঞাসিত এই বৈশিষ্ট্যটি এখন পিএইচপি 7 এ যুক্ত করা হয়েছে। @ রিজিয়ার 123 দ্বারা নীচের উত্তরটি দেখুন।
সিম্বা

@ সিম্বা - এটি দেখানোর জন্য ধন্যবাদ ভবিষ্যতের দর্শনার্থীদের সহায়তা করতে আপনি কি এই পৃষ্ঠায় স্ট্যাক ওভারফ্লোতে একটি উত্তর পোস্ট করতে চান?
সুজিত আগরওয়াল

1
আমার দরকার নেই; এই তথ্যের সাথে ইতিমধ্যে একটি উত্তর রয়েছে (নীচে দেখুন, @ রিজিয়ার 123 দ্বারা)।
সিম্বা

উত্তর:


40

কয়েক বছর কেটে গেছে, তবে আমি মনে করি তথ্য আপডেট করে রাখা দরকার!

পিএইচপি 7 এর পরে বেনামে ক্লাস তৈরি করা সম্ভব হয়েছে, সুতরাং আপনি এই জাতীয় জিনিসগুলি করতে সক্ষম হবেন:

<?php

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

    var_dump($child instanceof Foo); // true

?>

ম্যানুয়ালটিতে আপনি এটি সম্পর্কে আরও পড়তে পারেন

তবে আমি জানি না এটি জাভাস্ক্রিপ্টের সাথে কতটা একইভাবে প্রয়োগ করা হয়েছে, তাই জাভাস্ক্রিপ্ট এবং পিএইচপি-তে বেনাম শ্রেণীর মধ্যে কয়েকটি পার্থক্য থাকতে পারে।


@risyasin ধন্যবাদ, উত্তর আপডেট করেছেন এবং ম্যানুয়াল লিঙ্কটি এতে রেখেছেন।
Rizier123

পিএইচপি 7-এ সর্বশেষ পরিবর্তনগুলি বজায় রাখতে আপনার উত্তরটিকে সঠিক হিসাবে চিহ্নিত করা হচ্ছে। ধন্যবাদ @ রিজিয়ার 123
সুজিত আগরওয়াল

3
এটি আকর্ষণীয় তবে এটি সত্যই প্রশ্নের সমাধান করতে পারে না, কারণ ওপি ক্লাস তৈরি না করেই বিভিন্ন সদস্যের সাথে কোনও বস্তুর সূচনা করার কোনও সুবিধাজনক উপায় সম্পর্কে জিজ্ঞাসা করেছিল। আমি নিশ্চিত নই যে পিএইচপি-তে বেনামে ক্লাসগুলি এটি করতে ব্যবহৃত হতে পারে, এবং যদি এটি করতে পারে তবে আপনি কীভাবে ব্যাখ্যা করেন নি।
amh15

228

"অজ্ঞাতনামা" বস্তুর কথা বলার সময় সঠিক পরিভাষা নয়। "বেনামে টাইপের অবজেক্ট" বলা ভাল তবে এটি পিএইচপি-র ক্ষেত্রে প্রযোজ্য নয়।

পিএইচপি-তে সমস্ত বস্তুর একটি শ্রেণি থাকে। "ডিফল্ট" শ্রেণিটি হয় stdClassএবং আপনি এটির অবজেক্টগুলি এভাবে তৈরি করতে পারেন:

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

আরও সুবিধাজনক সিনট্যাক্সের জন্য আপনি কোনও বস্তুতে অ্যারে নিক্ষেপ করার সুবিধাও নিতে পারেন :

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

যাইহোক, পরামর্শ দিন যে কোনও বস্তুতে অ্যারে নিক্ষেপ করার ফলে সেই অ্যারে কীগুলির জন্য "আকর্ষণীয়" ফলাফল পাওয়া যাবে যা বৈধ পিএইচপি ভেরিয়েবলের নাম নয় - উদাহরণস্বরূপ, এখানে আমার একটি উত্তর যা দেখায় কীগুলি যখন অঙ্কগুলি দিয়ে শুরু হয় তখন কী ঘটে।


1
আমি কি একাধিক মূল্যবান অ্যারে ধাক্কা দিতে পারি?
সুজিত আগরওয়াল

2
@ কোডিংফ্রাক: আপনি করতে পারবেন তবে : তবে অ্যারেটিতে সাব-অ্যারে রয়েছে এবং আপনি সেগুলিও বস্তু হিসাবে চান তবে আপনাকে প্রত্যেককে স্পষ্টভাবে আপত্তি জানাতে হবে।
জন

21

হ্যা এটা সম্ভব! এই সাধারণ পিএইচপি বেনামে অবজেক্ট ক্লাসটি ব্যবহার করে । কিভাবে এটা কাজ করে:

// 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 ব্যবহার করতে পারেন ।
মিহাইলফ

আমি মনে করি তিনি কিছু মান সহ একটি স্টডি ক্লাস অবজেক্টটি সূচনা করার জন্য একটি ঝরঝরে উপায় চেয়েছিলেন। আপনি কি আপনার পদ্ধতির সাথে এটি করতে পারেন?
amh15

18

সাম্প্রতিক অবধি আমি ফ্লাইতে কীভাবে অবজেক্ট তৈরি করেছি।

$someObj = json_decode("{}");

তারপর:

$someObj->someProperty = someValue;

তবে এখন আমি সাথে যাচ্ছি:

$someObj = (object)[];

তারপরে আগের মতো:

$someObj->someProperty = someValue;

অবশ্যই যদি আপনি ইতিমধ্যে বৈশিষ্ট্য এবং মান জানেন তবে আপনি সেগুলি ভিতরে উল্লেখ করতে পারেন:

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

এনবি: পিএইচপি এর কোন সংস্করণ কাজ করে তা আমি জানি না যাতে আপনার এটি সম্পর্কে সচেতন হওয়া দরকার। তবে আমি মনে করি যে প্রথম পদ্ধতির (যা নির্মাণের জন্য কোনও বৈশিষ্ট্য না থাকলে এটিও সংক্ষিপ্ত) জসন_কেনড / জসন_ডেকোডযুক্ত সমস্ত সংস্করণের জন্য কাজ করা উচিত


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 আউটপুট হবে । এটি পিএইচপি: ক্লাস এবং অবজেক্টের একটি মন্তব্য থেকে চুরি করা হয়েছিল ।


3

বেনাম ক্লাসগুলির জন্য সমর্থন পিএইচপি .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

$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 () করবে will

<?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

এই একই কৌশল পিএইচপি ক্ষেত্রে প্রয়োগ করা যেতে পারে?

না - কারণ জাভাস্ক্রিপ্ট প্রোটোটাইপ / অবজেক্টের সরাসরি ঘোষণা ব্যবহার করে - পিএইচপি (এবং আরও অনেক OO ভাষায়) কোনও বস্তু কেবল একটি শ্রেণি থেকে তৈরি করা যায়।

সুতরাং প্রশ্নটি হয়ে যায় - আপনি কি কোনও বেনাম শ্রেণি তৈরি করতে পারেন?

আবার উত্তরটি হ'ল না - আপনি ক্লাসটি উল্লেখ না করে কীভাবে ইনস্ট্যান্ট করবেন?


বেনাম শ্রেণীর উদাহরণ তৈরি করার জন্য আপনার নামের প্রয়োজন নেই। জাভা: Object var = new Object() { ... };- সি ++:class { ... } var;
থিওপরেটর ২

1
আপনি এখন পিএইচপি-তে বেনামে ক্লাস তৈরি করতে পারেন।
ভিক্টর


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.