পিএইচপি খালি মূল্য থেকে ডিফল্ট অবজেক্ট তৈরি?


362

আমি এই ত্রুটিটি কেবলমাত্র আমার পিএইচপি পরিবেশের পিএইচপি 5.4 এবং এর বাইরে উন্নীত করার পরে দেখছি। ত্রুটিটি কোডের এই লাইনে নির্দেশ করে:

ত্রুটি:

খালি মান থেকে ডিফল্ট অবজেক্ট তৈরি করা হচ্ছে

কোড:

$res->success = false;

আমার প্রথমে আমার $resঅবজেক্টটি প্রকাশ করা দরকার ?


11
আপনি কীভাবে / কোথায় শুরু করছেন $res ?
নাভিদ

1
@NAVEED আছে
7heo.tk

উত্তর:


627

আপনার নতুন পরিবেশে E_STRICTসতর্কতাগুলি পিএইচপি সংস্করণ <= 5.3.x এ সক্ষমerror_reporting থাকতে পারে বা error_reportingকমপক্ষে E_WARNINGপিএইচপি সংস্করণ> = 5.4 এর সাথে সেট করেছে । যখন যে ত্রুটি সূত্রপাত হয় $resহয় NULLবা এখনো সক্রিয়া না:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

$resইতোমধ্যে কিছু মান থেকে আরম্ভ করা থাকলেও কোনও অবজেক্ট না হলে পিএইচপি একটি পৃথক ত্রুটি বার্তার প্রতিবেদন করবে :

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

E_STRICTপিএইচপি 5.4 এর পূর্বে মানগুলি অনুসরণ করার জন্য , বা E_WARNINGপিএইচপি> = 5.4 এ স্বাভাবিক ত্রুটি স্তরটি ধরে নিয়ে আপনি ধরে নিচ্ছেন যে আপনি জেনেরিক কোনও বস্তু তৈরি করতে এবং সম্পত্তিটি নির্ধারণের চেষ্টা করছেন success, আপনাকে বিশ্বব্যাপী নেমস্পেসে $resএকটি বিষয় হিসাবে ঘোষণা করতে হবে stdClass:

$res = new \stdClass();
$res->success = false;

38
আপনি পরীক্ষা shoud বস্তুর আগে থেকেই আছে কিনা: if (!isset($res)) $res = new stdClass();। অন্যথায়, এই কোডটি "পুরাতন পিএইচপি" অন্তর্নিহিত অবজেক্ট তৈরির জন্য সমপরিমাণ প্রতিস্থাপন নয়।
টিএমএস

6
@ টমাস কি আমাদের আবার এটি করা দরকার? মোডগুলি গতবারের মন্তব্যের থ্রেডটি পরিষ্কার করেছে কারণ এটি খুব কম মূল্য যুক্ত করেছে। কোনও "পুরানো পিএইচপি" অন্তর্নিহিত অবজেক্ট তৈরি নেই। এটি সর্বদা একটি ত্রুটি ছিল এবং সর্বদা একটি সতর্কতা জারি করেছিল, ঠিক যে এটি E_STRICT থেকে 5_4 এ E_WARNING এ পরিবর্তন করা হয়েছিল, তাই কিছু লোক E_STRICT এ মনোযোগ না দিয়ে কখনও এর মুখোমুখি হয়নি।
মাইকেল বারকোভস্কি

4
@ পিটারআল্ফভিন এটি নির্দিষ্ট একটি রান হিসাবে সংজ্ঞায়িত হয়নি ! কিন্তু বিভিন্ন দৌড়ে, কোডের ঠিক একই জায়গায় , অবজেক্টটি ইতিমধ্যে সংজ্ঞায়িত হতে পারে! লোকেরা প্রায়শই এটি ভাবতে ভুল করে এবং আমি এটিকে জোর দেওয়ার চেষ্টা করি।
টিএমএস

2
মাইকেল, অন্তর্নিহিত অবজেক্ট তৈরি সর্বদা ছিল এবং এখনও 5.4 তে উপস্থিত রয়েছে। এবং পিএইচপি <5.3 এ বিটিডাব্লু এটি E_STRICT বা E_WARNING ছিল না। এবং বিটিডাব্লু, মোডগুলি মন্তব্যটি পুনরুদ্ধার করেছে এবং আমাকে এটি নীচে নামাতে বলা হয়েছিল, এজন্যই আমি এটি আবার পোস্ট করেছি।
টিএমএস

3
@ টমাস ওহ, ঠিক আছে, আমি মনে করি আপনি যা বলতে চাইছেন তা পেয়েছি। আপনি / মাইকেল এটি বন্ধ করতে পারবেন না যে এটি অদ্ভুত বলে মনে হচ্ছে। বিটিডাব্লু, এই এক্সচেঞ্জটি আমাকে বুঝতে সক্ষম করেছে যে "শক্তির" দিক থেকে ইটালিক্স <সাহসী <allcaps এবং যখন allcaps = চিৎকার করে এবং italics = politeEmphasis, সাহসী একটি মাঝারি স্থানে যেখানে গ্রহণযোগ্যতা প্রশ্নবিদ্ধ। :-)
পিটার আলফভিন

57

এই বার্তাটি E_STRICTপিএইচপি <= 5.3 এর জন্য। পিএইচপি ৫.৪ থেকে, এটি আনলাকিলিতে পরিবর্তিত হয়েছিল E_WARNING। যেহেতু E_WARNINGবার্তা উপযোগী, আপনি তাদের সম্পূর্ণরূপে অক্ষম করতে চাই না।

এই সতর্কতা থেকে মুক্তি পাওয়ার জন্য আপনাকে অবশ্যই এই কোডটি ব্যবহার করতে হবে:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

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


2
@ কার্লোসভিনি, এটি আপনাকে দেবে Undefined variable: res
পেসারিয়ার 26'15

1
@ পেসারিয়র আপনি ঠিক বলেছেন, আপনি সবচেয়ে ভাল করতে পারেন: $ res = isset ($ res)? $ রেজাল্ট: নতুন স্টাডক্লাস (); - 6 মাস আগে আমি E_NOTICE সক্ষম না করানোর কারণ ছিল, কারণ এটি খুব জঘন্য ভার্চুয়াল।
কার্লোসভিনি

13

কেবল,

    $res = (object)array("success"=>false); // $res->success = bool(false);

অথবা আপনি ক্লাসগুলি সাথে ইনস্ট্যান্ট করতে পারেন:

    $res = (object)array(); // object(stdClass) -> recommended

    $res = (object)[];      // object(stdClass) -> works too

    $res = new \stdClass(); // object(stdClass) -> old method

এবং এর সাথে মানগুলি পূরণ করুন:

    $res->success = !!0;     // bool(false)

    $res->success = false;   // bool(false)

    $res->success = (bool)0; // bool(false)

আরও ইনফস: https://www.php.net/manual/en/language.tyype.object.php#language.types.object.casting


কেন নতুন স্টাডি ক্লাস () একটি "পুরাতন" পদ্ধতি হিসাবে বিবেচিত? অন্যরা কি কোনওভাবে ভাল?
হারুন

এটি কেবল পুরানো পিএইচপি সংস্করণ থেকে
পিয়ার্স

আমার ক্ষেত্রে আমার $this->route->uri = new stdClass();পক্ষে কাজ করছে না, আমার এখনও সতর্কতা রয়েছে। দ্রষ্টব্য: $this->routeবিদ্যমান
মেলোম্যান

সম্ভবত এটি পিএইচপি এর নতুন সংস্করণগুলির সাথে সামঞ্জস্য নয়? আপনি কোন সংস্করণ ব্যবহার করেছেন?
পীর

6

আপনি যদি "@" অক্ষরটি লাইনের শুরু করেন তবে পিএইচপি এই লাইনের জন্য কোনও সতর্কতা / নোটিশ দেখায় না। উদাহরণ স্বরূপ:

$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value

এই রেখার জন্য এই সতর্কতাটি প্রতিরোধের জন্য আপনাকে অবশ্যই "@" অক্ষরটি এই লাইনের শুরুতে হবে:

@$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20

বিকাশ করার সময় আমি এই কৌশলটি ব্যবহার করছি। আমি সমস্ত সতর্কতা বার্তাগুলি অক্ষম করতে পছন্দ করি না যদি আপনি সতর্কতাগুলি সঠিকভাবে পরিচালনা না করেন তবে ভবিষ্যতে সেগুলি একটি বড় ত্রুটি হয়ে যাবে।


1
@ সতর্কতাগুলি এটি দমন করে প্রতিরোধ করে না, যতক্ষণ আপনার পরিচালনাযোগ্য কোড রয়েছে ততক্ষণ ঠিক আছে। তবে যদি আপনার কোডটি আরও বড় কিছু হয়ে যায় এবং আপনি কোনও সমস্যার মধ্যে পড়ে থাকেন তবে আপনি এটি ব্যবহার করে কোনওরকম অনুশোচনা করবেন। আপনি যে সকল সতর্কতা অবলম্বন করতে চান তার জন্য নিজেকে এই সমস্ত "@" সন্ধান করতে দেখবেন কারণ সাময়িকভাবে এটি তার উদ্দেশ্যটি ভেবেছিল যে বাস্তবে যখন এটি আপনার সাথে কথা বলছে তখন আপনি সমস্যাটি স্থির করে দিয়েছেন এবং আপনি ঠিকই চাইবেন না ' শোনো না
ভিনসেন্ট এডওয়ার্ড গেদারিয়া বিনুয়া

আমি আগে থেকেই জানি. এটি সংক্ষিপ্ত এবং দ্রুত উত্তর। এর জন্য প্রচুর সমাধান রয়েছে।
কোডডমন্যাঘ

2
অসাধারণ! আমি বিনীতভাবে অসম্মতি জানাতে পারি, ত্রুটিটি আড়াল করা আসলেই সমস্যার সমাধান করতে পারে না (যেমনটি র‌্যামি নসর মন্তব্য করেছিলেন)।
ভিনসেন্ট এডওয়ার্ড গেদারিয়া বিনুয়া

এই workaround আমার পিএইচপি 7.2 একমাত্র workin।
মেলোম্যান

3

যদি আপনার অ্যারে থাকে এবং এতে বস্তু যুক্ত হন তবে এটি চেষ্টা করুন।

$product_details = array();

foreach ($products_in_store as $key => $objects) {
  $product_details[$key] = new stdClass(); //the magic
  $product_details[$key]->product_id = $objects->id; 
   //see new object member created on the fly without warning.
}

এই পাঠায় ARRAY এর অবজেক্টস পরে ব্যবহার করার জন্য ~!


ধন্যবাদ!!!! এই কাজটি করতে সাহায্য করে। আমাকে পিএইচপি ধাপে ধাপে প্রতিটি উপাদানটি কী তা জানাতে হয়েছিল। অলস লোকে কোড না দেওয়ার জন্য আমাকে মনে করিয়ে দেওয়ার জন্য ধন্যবাদ
ইয়ানিকে

2

এটা চেষ্টা কর:

ini_set('error_reporting', E_STRICT);

1
ধন্যবাদ। যখন আপনি তৃতীয় পক্ষের লাইব্রেরি যেমন নসোঅ্যাপ ব্যবহার করছেন এবং উত্সটি পরিবর্তন করতে / চান না তখন এটি সম্পূর্ণ ব্যবহারযোগ্য। যে ক্ষেত্রে আপনাকে error_reporting পরিবর্তন করতে পারেন E_STRICT শুধু অন্যান্য সোর্স ফাইল প্রয়োজন সামনে স্তর।
এমটোলু

যদিও আমি আমার সমস্যাটি সমাধান করার জন্য এটিকে কেবল nusoap এর শীর্ষে যুক্ত করেছি।
বদওয়াসেল

11
তাই না? এখানে কোড E_STRICTমারাত্মক ত্রুটির জন্য বার্তা দমন করা সহ ত্রুটিগুলি ব্যতীত সমস্ত ত্রুটি প্রতিবেদন অক্ষম করে । এই নির্দিষ্ট সতর্কতাটি সমাধান করার জন্য এটি কোনও যুক্তিসঙ্গত পরামর্শ নয় এবং এর চেয়ে আরও বেশি কিছু এমন যা আপনি কখনও কখনও করতে চান না। কেন 5 জন লোক এটিকে উচ্চারণ করেছে, আমার কোনও ধারণা নেই।
মার্ক আমেরিকা

1
এটা খুব খারাপ! ini_set('error_reporting', -1);ডিবাগ করার সময় ব্যবহার করুন তবে পূর্বের মতো উপরেরটি ব্যবহার করবেন না।
Kzqai

ঠিক আছে, তাই আপনি কি এটি লুকিয়ে রেখে সমস্যার সমাধান করছেন? আপনার কোডটি প্রত্যাশার মতো কাজ করবে তা নিশ্চিত নয় ...
পীর

1

আমার একই সমস্যা ছিল এবং এটি সমস্যার সমাধান বলে মনে হচ্ছে। আপনার কেবলমাত্র শ্রেণীর $ res অবজেক্টটি আরম্ভ করতে হবে। ধরুন এখানে ক্লাসের নাম টেস্ট।

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;

1

এটি একটি সতর্কতা যা আমি পিএইচপি 7 এ सामना করেছি, এটির সহজ সমাধানটি ব্যবহারের আগে ভেরিয়েবলকে আরম্ভ করে initial

$myObj=new \stdClass();

একবার আপনি এটি অন্তর্নিহিত পরে আপনি এটি বস্তুর জন্য ব্যবহার করতে পারেন

 $myObj->mesg ="Welcome back - ".$c_user;

0

এই সমস্যাটি হ'ল কারণ আপনি অবজেক্টের কোনও উদাহরণকে অর্পণ করছেন যা আরম্ভ করা হয়নি। যেমন:

আপনার ক্ষেত্রে:

$user->email = 'exy@gmail.com';

সমাধান:

$user = new User;
$user->email = 'exy@gmail.com';

আপনি কি ধরে নিচ্ছেন না যে "ব্যবহারকারী" ক্লাসটি বিদ্যমান? যা এটি নাও করতে পারে এবং এখন এটি একটি ভিন্ন ত্রুটি তৈরি করবে?
ক্রিস্টোফার থমাস

1
আসলে আমি ব্যবহারকারীর অবজেক্টের একটি উদাহরণ তৈরি করি নি তাই আমি একটি ত্রুটি পেয়েছি। কিন্তু একটি উদাহরণ তৈরি করার পরে। এটি কাজ করেছে .. ওওপিএস ধারণার সাথে এটি একটি জেনারিক সমস্যা :)
বাস্টিন রবিন

6
ভাল, আসলে আসল সমস্যাটি হ'ল আপনার উদাহরণটি ব্যবহারকারী শ্রেণিকে সংজ্ঞায়িত করা হিসাবে ধরে নিয়েছে, এটি কোনও অবজেক্ট অরিয়েন্টেশনের জেনারিক সমস্যা নয়, এটির একটি মূল প্রয়োজনীয়তা;)
ক্রিস্টোফার টমাস

1
আমি বরং একটি জেনেরিক "stdClass" রেখেছি "ইউজার" এর ভিত্তি প্রতিস্থাপন করে।
টেকনিকুইস্ট

0

এই ত্রুটিটি পাওয়ার একটি সহজ উপায় হ'ল নীচে (ক) টাইপ করা, যার অর্থ টাইপ (খ)

(ক) $this->my->variable

(খ) $this->my_variable

তুচ্ছ, তবে খুব সহজেই উপেক্ষা করা এবং আপনি এটির সন্ধান না করা থাকলে স্পট করা শক্ত।


এটি কীভাবে মূল প্রশ্নের সাথে সম্পর্কিত? কোন মিশ্রিত করা-আপ হয়েছিল মধ্যে _এবং->
নিকো Haase

0

আপনার ভেরিয়েবল ঘোষিত হয়েছে এবং সঠিক টাইপ আছে কিনা তা খতিয়ে দেখার প্রয়োজন হতে পারে।

if (!isset($res) || !is_object($res)) {
    $res = new \stdClass();
    // With php7 you also can create an object in several ways.
    // Object that implements some interface.
    $res = new class implements MyInterface {};
    // Object that extends some object.
    $res = new class extends MyClass {};
} 

$res->success = true;

দেখুন পিএইচপি বেনামী শ্রেণীর


0

কোনও এপিআই থেকে ফিরে আসা কোনও বস্তুর সাথে ভেরিয়েবল যুক্ত করার চেষ্টা করার সময় আমার একই সমস্যা হয়েছিল। আমি ফোরচ লুপ দিয়ে ডেটাটি দিয়ে পুনরাবৃত্তি করছিলাম।

foreach ( $results as $data ) {
    $data->direction = 0;
}

এটি "খালি মান থেকে ডিফল্ট অবজেক্ট তৈরি করা" লারাভেলের ব্যতিক্রম।

আমি খুব ছোট একটি পরিবর্তন দিয়ে এটি ঠিক করেছি।

foreach ( $results as &$data ) {
    $data->direction = 0;
}

কেবল $ ডেটা একটি রেফারেন্স তৈরি করে।

আমি আশা করি যে এটি কারওর পক্ষে সহায়তা করবে এটি আমার মধ্য থেকে বেরিয়ে আসা নরকে বিরক্ত করেছিল!


0
  1. প্রথমে মনে করুন আপনার অবজেক্ট $ res = new \ stdClass () তৈরি করা উচিত;

  2. তারপরে কী এবং মান দিয়ে অবজেক্ট বরাদ্দ করুন থাই $ রেজ-> সাফল্য = মিথ্যা;


(আমি বুঝতে পারি না thay)) যেখানে আপনি কিছু বিষয়বস্তুর পরে লাইন বিরতি চান, সেখানে বিরতি-করার আগে লাইনের দৃশ্যমান সামগ্রীতে দুটি ফাঁকা স্থান যুক্ত করুন space
গ্রেইবার্ড

-1

না আপনি করবেন না .. এটি যখন এটিতে সাফল্যের মান যুক্ত করবে তখন এটি তৈরি করবে you আপনি যদি একটি নির্দিষ্ট না করে থাকেন তবে পূর্বনির্ধারিত বর্গ উত্তরাধিকার সূত্রে প্রাপ্ত হয়।


4
যদিও এটি কঠোর মানদণ্ডের বার্তাটি ফিরিয়ে দেবে ... প্রথমে ম্যানুয়ালি তৈরি করার পক্ষে এটি কেবল ভাল অনুশীলন এবং পিএইচপি তুলনামূলকভাবে কোডিং অনুশীলনের ক্ষেত্রে তুলনামূলকভাবে সহনশীল হলেও আপনার জিনিসগুলি সঠিকভাবে করা উপেক্ষা করা উচিত নয়।
মার্ক বেকার

4
বুঝেছি, আমি কেবল একটি সাধারণ হ্যাঁ বা না দিয়ে প্রশ্নের উত্তর
দিচ্ছিলাম

-1

ব্যবহার করার চেষ্টা করুন:

$user = (object) null;

2
সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি সেগুলিতে কোডটি কী করা উচিত এবং কেন এটি অন্যকে পরিচয় করিয়ে না দিয়ে সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে।
লুকাস্কারো

-12

আমি নিম্নলিখিতটি ত্রুটিযুক্ত পিএইচপি ফাইলের শীর্ষে রেখেছি এবং ত্রুটিটি আর প্রদর্শিত হয়নি:

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