পিএইচপি-তে কীভাবে একটি খালি বস্তু সংজ্ঞা দেওয়া যায়


383

একটি নতুন অ্যারে দিয়ে আমি এটি করি:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

কোনও অবজেক্টের জন্য কি একই রকম সিনট্যাক্স রয়েছে?

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; আপনি জানেন, কেবল নিরাপদ থাকতে হবে।
জিওনক্রস

1
Google Now এর মত এই প্রশ্নের শিরোনাম ইন্ডেক্স করেছেন: Arrays - How to define an empty object in PHP। অ্যারেগুলির সাথে কোনও সম্পর্ক নেই
কলব ক্যানিয়ন

উত্তর:


848
$x = new stdClass();

ম্যানুয়ালটিতে একটি মন্তব্য এটিকে সর্বোত্তম করে তুলেছে:

stdClass ডিফল্ট পিএইচপি অবজেক্ট। stdClass এর কোনও বৈশিষ্ট্য, পদ্ধতি বা পিতামাতাই নেই। এটি যাদু পদ্ধতিগুলি সমর্থন করে না এবং কোনও ইন্টারফেস প্রয়োগ করে না।

আপনি যখন কোনও স্কেলার বা অ্যারেটিকে অবজেক্ট হিসাবে কাস্ট করেন, আপনি স্টাডক্লাসের একটি উদাহরণ পাবেন। যখনই আপনার জেনেরিক অবজেক্টের উদাহরণ প্রয়োজন তখন আপনি stdClass ব্যবহার করতে পারেন।


5
$ ণ = (বস্তু) শূন্য; - যদি কোনও অবজেক্টকে কোনও বস্তুতে রূপান্তর করা হয় তবে তা সংশোধন করা হয় না। যদি অন্য যে কোনও ধরণের মান কোনও বস্তুতে রূপান্তরিত হয়, তবে stdClass অন্তর্নির্মিত শ্রেণির একটি নতুন উদাহরণ তৈরি হয়। মানটি যদি নুল হয় তবে নতুন উদাহরণটি খালি থাকবে। অ্যারেগুলি কী দ্বারা চিহ্নিত বৈশিষ্ট্য এবং সম্পর্কিত মানগুলির সাথে কোনও বস্তুতে রূপান্তর করে। অন্য যে কোনও মানের জন্য, স্কেলার নামের একটি সদস্য ভেরিয়েবলের মানটি থাকবে।
ডিডিএস 21

11
আমি কেবল stdClass"স্ট্যান্ডার্ড ক্লাস" হিসাবে আমার মাথায় বলি
sjagr

1
আপনি যদি আমার উত্তরটি ভুলে যেতে থাকেন তবে :)
রাফাশী

26
যদি আপনি "খুঁজে পাওয়া যায় না" মুখোমুখি হন: new \stdClass(); পিএইচপি
নেমস্পেস

3
@ ইভানক্যাসেলেলানোস আপনি কীভাবে stdClass()শব্দটি থেকে মনে রাখতে পারেন তা ব্যাখ্যা করতে পারেন AIDS?
আদম

117

"খালি" অবজেক্ট তৈরি করার মানক উপায় হ'ল:

$oVal = new stdClass();

তবে, পিএইচপি> = 5.4 দিয়ে আমি ব্যক্তিগতভাবে ব্যবহার করতে পছন্দ করি :

$oVal = (object)[];

এটি সংক্ষিপ্ত এবং আমি ব্যক্তিগতভাবে এটিকে আরও স্পষ্ট মনে করি কারণ স্টাডক্লাস নবীন প্রোগ্রামারদের জন্য বিভ্রান্তিকর হতে পারে (যেমন "আরে, আমি কোনও শ্রেণি নয়, একটি জিনিস চাই!" ...)।

পিএইচপি <5.4 এর সাথে একই:

$oVal = (object) array();

(object)[]সমতূল্য new stdClass()

পিএইচপি ম্যানুয়ালটি দেখুন ( এখানে ):

stdClass : বস্তুতে টাইপকাস্ট করে তৈরি করা হয়েছে।

এবং ( এখানে ):

যদি কোনও অবজেক্টকে কোনও বস্তুতে রূপান্তর করা হয় তবে এটি সংশোধিত হয় না। যদি অন্য যে কোনও ধরণের মান কোনও বস্তুতে রূপান্তরিত হয়, তবে stdClass অন্তর্নির্মিত শ্রেণির একটি নতুন উদাহরণ তৈরি হয়


তবে মনে রাখবেন যে খালি (V oval) মিথ্যা প্রত্যাবর্তন করবে , যেমন @ পলপ বলেছেন:

কোনও সম্পত্তি সহ অবজেক্টগুলিকে আর খালি বিবেচনা করা হবে না।

আপনার উদাহরণ সম্পর্কে, আপনি যদি লিখেন:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

পিএইচপি নীচের সতর্কতা তৈরি করে, স্পষ্টতই সম্পত্তি তৈরি করে key1(একটি বস্তু নিজেই)

সতর্কতা: খালি মান থেকে ডিফল্ট অবজেক্ট তৈরি করা

যদি আপনার কনফিগারেশন ( ত্রুটি প্রতিবেদন করার স্তরটি দেখুন ) ব্রাউজারটিতে এই সতর্কতাটি দেখায় তবে এটি কোনও সমস্যা হতে পারে । এটি অন্য একটি সম্পূর্ণ বিষয়, তবে তাত্ক্ষণিকভাবে অগ্রাহ্য করার জন্য ত্রুটি নিয়ন্ত্রণ অপারেটর (@) ব্যবহার করার জন্য একটি দ্রুত এবং নোংরা পদ্ধতির ব্যবহার করা যেতে পারে :

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
সমস্যা সমাধানের পরিবর্তে, আপনি একটি নতুন তৈরি করছেন। ফিক্সিংয়ের যে সমস্যাটি দরকার তা হ'ল লোকেরা জানে যে কী stdClassকরে।
পেসারিয়ার

2
আমি কি লিখেছি stdClass। আমি stdClassকোডটি ব্যবহার করেছি যা প্রশ্নের উত্তর দেয়। আমি দুঃখিত তবে আমি একটি নতুন সমস্যা তৈরি করছি না, এটি ছিল আমার ব্যক্তিগত মতামত (যেমনটি আমি লিখেছি)।
cgaldiolo

6
"ব্যক্তিগত পছন্দ"! = "সমস্যা"
সিগলদিওল

4
@ পেসার, আপনার জেদ আমি বুঝতে পারি না। প্রশ্নটি ছিল 'পিএইচপি-তে কোনও খালি বিষয় কীভাবে সংজ্ঞায়িত করা যায়'। আমার উত্তরটি সঠিক এবং আমি "নতুন স্টাডক্লাস ()" ব্যবহার করতে লিখেছি। আমি 'ed209' ব্যবহারকারীর জন্য যে কোডটি সরবরাহ করেছি তা সঠিক এবং আমি "নতুন stdClass ()" ব্যবহার করেছি। এছাড়াও আমি একটি ব্যক্তিগত মতামত যুক্ত করেছি এবং আমি স্পষ্ট হতে একটি সাহসী "ব্যক্তিগতভাবে" ব্যবহার করেছি যা "স্ট্যান্ডার্ড" যাওয়ার উপায় নয়। আমার নম্র মতে এমন একটি সমস্যা যা এতগুলি মন্তব্যের দাবি রাখার অন্তত একটি ভুল উত্তর হওয়া উচিত। পরিবর্তে যদি আপনি একটি ব্যক্তিগত মতামতকে সমস্যা হিসাবে বিবেচনা করেন, তবে এটি ধারণার গঠনমূলক ভাগ করে নেওয়ার জন্য সমস্যা is
cgaldiolo

9
আমি শর্টহ্যান্ডটি সত্যিই পছন্দ করি(object) []
রহিল উজির

35

আমি উল্লেখ করতে চাই যে পিএইচপি-তে খালি অবজেক্টের মতো অর্থে কোনও জিনিস নেই:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

তবে অবশ্যই $ আপত্তি খালি থাকবে।

অন্যদিকে খালি অ্যারের অর্থ উভয় ক্ষেত্রেই খালি

$arr = array();
var_dump(empty($arr));

চেঞ্জলগ ফাংশন থেকে উদ্ধৃতি খালি

কোনও সম্পত্তি সহ অবজেক্টগুলিকে আর খালি বিবেচনা করা হবে না।


খালি জন্য চেঞ্জলগে আমি সেই উদ্ধৃতিটি খুঁজে পাইনি।
Powpow12

@ Powpow12 এটি সেখানে থাকত । এটি 5.0.0 এ পরিবর্তন করা হয়েছিল।
স্ট্যানলি উমানোজোই


14

আমি পছন্দ করি জাভাস্ক্রিপ্টে বেনামে টাইপের অবজেক্ট তৈরি করা কতটা সহজ:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

তাই আমি সবসময় এই জাতীয় জিনিসগুলি জাভাস্ক্রিপ্টের মতো পিএইচপিতে লেখার চেষ্টা করি :

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

তবে এটি মূলত একটি অ্যারে হিসাবে আপনি জাসদের মতো কোনও সম্পত্তিতে বেনামী ফাংশন নির্ধারণের মতো কাজগুলি করতে পারবেন না:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

ঠিক আছে, আপনি এটি করতে পারেন, তবে আইএমও ব্যবহারিক / পরিষ্কার নয়:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

এছাড়াও, এই সিন্থ্যাক্সটি ব্যবহার করে আপনি কিছু মজার চমক পেতে পারেন তবে বেশিরভাগ ক্ষেত্রেই এটি দুর্দান্ত কাজ করে।


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
মাইক অ্যারন

11

ভুলে যেতে থাকলে জুমব্যাটের উত্তর ছাড়াও stdClass

   function object(){

        return new stdClass();

    }

এখন আপনি এটি করতে পারেন:

$str='';
$array=array();
$object=object();

আমি এই কৌশলটি পছন্দ করি, যদিও বেশিরভাগ আইডিইগুলি একটি শব্দ হিসাবে "অবজেক্ট" শব্দটি হাইলাইট করে না যা অন্যান্য প্রোগ্রামারদের জন্য বিভ্রান্তিকর হতে পারে। তবে ওহে, এটা আমার পক্ষে কাজ করে!
ব্রিকসস্টার

7

আপনি ব্যবহার করতে পারেন new stdClass()(যা প্রস্তাবিত):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

অথবা আপনি একটি খালি অ্যারেটিকে কোনও অবজেক্টে রূপান্তর করতে পারেন যা অন্তর্নির্মিত শ্রেণীর stdClass এর একটি নতুন খালি দৃষ্টান্ত তৈরি করে:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

অথবা আপনি nullমানটিকে এমন একটি বস্তুতে রূপান্তর করতে পারেন যা অন্তর্নির্মিত শ্রেণীর stdClass এর একটি নতুন খালি দৃষ্টান্ত তৈরি করে:

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

স্টিডক্লাসে ডেটা অ্যাক্সেস করতে অনুরূপ ফ্যাশনে আপনি কোনও অসম্পূর্ণ অ্যারে দিয়ে করেন কেবল {$ var} বাক্যবিন্যাস ব্যবহার করুন।

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

অন্যরা যেমন উল্লেখ করেছে, আপনি stdClass ব্যবহার করতে পারেন। তবে আমি মনে করি এটি () ছাড়াই এটি পরিষ্কার so

$obj = new stdClass;

তবে প্রশ্নের ভিত্তিতে, মনে হচ্ছে আপনি যা চাইছেন তা হ'ল ফ্লাইয়ের কোনও বস্তুর সাথে বৈশিষ্ট্য যুক্ত করতে সক্ষম হবেন। যদিও আপনি এটি করতে পারেন তবে আপনাকে এটির জন্য স্টাডক্লাস ব্যবহার করার দরকার নেই। সত্যিই আপনি যে কোনও ক্লাস ব্যবহার করতে পারেন। কেবল কোনও শ্রেণীর একটি অবজেক্ট উদাহরণ তৈরি করুন এবং বৈশিষ্ট্যগুলি সেট করা শুরু করুন। আমি আমার নিজস্ব শ্রেণি তৈরি করতে চাই যার নামটি কেবলমাত্র কয়েকটি বেসিক বর্ধিত কার্যকারিতা সহ যা আমি এই ক্ষেত্রে ব্যবহার করতে পছন্দ করি এবং অন্যান্য শ্রেণি থেকে বর্ধনের জন্য চমৎকার। মূলত এটি আমার নিজস্ব অবজেক্ট ক্লাস। আমি কেবল ও () নামে একটি ফাংশন রাখতে চাই। তাই ভালো:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

আপনি যদি নিজের বেস অবজেক্টের ধরণটি পছন্দ করতে না চান তবে আপনি সহজেই ও () একটি নতুন স্টাডক্লাস ফিরে আসতে পারেন। একটি সুবিধা হ'ল স্টাডক্লাসের চেয়ে ও স্মরণ রাখা সহজ এবং আপনি যদি এটি শ্রেণীর নাম, ফাংশন নাম বা উভয় হিসাবে ব্যবহার করেন তবে তা ছোট sh আপনার ও ক্লাসের ভিতরে আপনার কোনও কোড না থাকলেও, এখনও অবাস্তবভাবে মূলধন এবং নামযুক্ত স্টাডক্লাসের চেয়ে মুখস্থ করা সহজ (যা একটি 'যৌন সংক্রামিত রোগ শ্রেণীর' ধারণাটি ডেকে আনতে পারে)। আপনি যদি ও ক্লাসটি কাস্টমাইজ করেন তবে আপনি কনস্ট্রাক্টর সিনট্যাক্সের পরিবর্তে ও () ফাংশনের জন্য কোনও ব্যবহার খুঁজে পেতে পারেন। এটি একটি সাধারণ ফাংশন যা কোনও মান দেয় যা নির্মাতার চেয়ে কম সীমাবদ্ধ থাকে। উদাহরণস্বরূপ, একটি ফাংশন নাম কলকরণযোগ্য পরামিতি গ্রহণ করে এমন একটি ফাংশনে স্ট্রিং হিসাবে পাস করা যেতে পারে। একটি ফাংশনও শৃঙ্খলা সমর্থন করে। সুতরাং আপনি যেমন কিছু করতে পারেন:

উপরের স্তরটি সম্পূর্ণ অভ্যন্তরীণ ডিএসএলতে লেখা থাকাকালীন অন্যান্য ভাষার স্তর তৈরি করতে বেস "ভাষা" এর পক্ষে এটি দুর্দান্ত শুরু। এটি উন্নয়নের লিস্প স্টাইলের মতো এবং পিএইচপি বেশিরভাগ লোকেরা বুঝতে পারার চেয়ে ভালভাবে এটি সমর্থন করে। আমি বুঝতে পারি যে এটি প্রশ্নের জন্য কিছুটা স্পর্শকাতর, তবে প্রশ্নটি আমার মনে হয় পিএইচপি এর ক্ষমতা সম্পূর্ণরূপে ব্যবহারের ভিত্তি is


2
@ পেসারিয়র বলতে কি প্যারেন্টিসেসনেস মানে? ;) cis.upenn.edu/~matuszek/ জেনারেল
জাভা

1
এটি একটি টাইপো, এটি প্রথমতা হওয়া উচিত।
পেসারিয়ার

@Pacerier ভাল পয়েন্ট english.stackexchange.com/questions/130219/...
still_dreaming_1

4

আপনি যদি অপরিজ্ঞাত সম্পত্তির কোনও সতর্কতা না পেয়ে গতিশীল বৈশিষ্ট্য সহ বস্তু (জাভাস্ক্রিপ্টের মতো) তৈরি করতে চান want

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


4

এটিতে জেনেরিক অবজেক্ট এবং মানচিত্র কী মান যুক্ত করুন।

$oVal = new stdClass();
$oVal->key = $value

অথবা কোনও বস্তুতে একটি অ্যারে নিক্ষেপ করুন

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

আপনি যদি এটি করতে না চান:

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন:

পিএইচপি> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

পিএইচপি <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

এখানে পুনরাবৃত্তি সহ একটি উদাহরণ:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

0

আপনার কাছে এই খারাপ তবে ব্যবহারযোগ্য প্রযুক্তি রয়েছে:

$var = json_decode(json_encode([]), FALSE);

0

stdClass ডিফল্ট পিএইচপি অবজেক্ট। stdClass এর কোনও বৈশিষ্ট্য, পদ্ধতি বা পিতামাতাই নেই। এটি যাদু পদ্ধতিগুলি সমর্থন করে না এবং কোনও ইন্টারফেস প্রয়োগ করে না।

আপনি যখন কোনও স্কেলার বা অ্যারেটিকে অবজেক্ট হিসাবে কাস্ট করেন, আপনি স্টাডক্লাসের একটি উদাহরণ পাবেন। যখনই আপনার জেনেরিক অবজেক্টের উদাহরণ প্রয়োজন তখন আপনি stdClass ব্যবহার করতে পারেন।

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClass বেস ক্লাস নয়! পিএইচপি ক্লাসগুলি কোনও ক্লাস থেকে স্বয়ংক্রিয়ভাবে উত্তরাধিকারী হয় না। সমস্ত ক্লাসগুলি স্বতন্ত্র, যদি না তারা স্পষ্টভাবে অন্য শ্রেণির প্রসারিত করে। পিএইচপি এই বিষয়ে অনেক অবজেক্ট-ভিত্তিক ভাষা থেকে পৃথক।

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

আপনি আপনার কোডে 'stdClass' নামে একটি শ্রেণি সংজ্ঞায়িত করতে পারবেন না। এই নামটি ইতিমধ্যে সিস্টেম ব্যবহার করে। আপনি 'অবজেক্ট' নামে একটি শ্রেণি সংজ্ঞায়িত করতে পারেন।

আপনি একটি ক্লাস সংজ্ঞায়িত করতে পারেন যা stdClass প্রসারিত করতে পারে তবে আপনি কোনও সুবিধা পাবেন না, কারণ stdClass কিছুই করে না।

(পিএইচপি 5.2.8 এ পরীক্ষিত)

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