কীভাবে কোনও বস্তু ধ্বংস করবেন?


120

আমি যতদূর জানি (যা খুব সামান্য), দুটি উপায় দেওয়া হয়েছে:

$var = new object()

তারপর:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

আরও ভাল পদ্ধতি? আমি কি এখানে চুল বিভক্ত করছি?

উত্তর:


152

আপনি খুঁজছেন unset()

তবে এটি বিবেচনায় রাখুন যে আপনি কোনও বিষয় স্পষ্টভাবে ধ্বংস করতে পারবেন না।

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

এটি বলেছিল, মনে রাখবেন না যে পিএইচপি সর্বদা পৃষ্ঠা পরিবেশন করার সাথে সাথে অবজেক্টগুলিকে ধ্বংস করে দেয়। সুতরাং এটি শুধুমাত্র সত্যই দীর্ঘ লুপ এবং / বা ভারী নিবিড় পৃষ্ঠাগুলিতে প্রয়োজন।


1
ফ্র্যাঙ্কি, আমি সি ++ থেকে এসেছি, যেখানে আমরা newএকবার ব্যবহার করি , তখন আমাদের অবশ্যইdelete একবার ব্যবহার করা উচিত । এটি পিএইচপি-তে সত্য নয়? স্বয়ংক্রিয় আবর্জনা সংগ্রহ যখন বস্তুর আর প্রয়োজন হয় না?
gsamaras

3
পছন্দ করেছেন যদিও আপনি ফাঁসও করতে পারেন, এবং যদি আপনি ডেমোন বা অনুরূপ করছেন তবে আপনার পিএইচপি এর জিসি আরও পড়তে হবে। বেশিরভাগ সাইটগুলিতে অনুরোধটি এত অল্পকালীন যে তাতে কিছু আসে যায় না। php.net/manual/en/features.gc.refcounting-basics.php
ফ্র্যাঙ্কী

নেই unset()অবজেক্ট রেফারেন্স সরিয়ে ফেলা হবে?
ইউশা আলেয়াউব

9

একটি কার্যকর পোস্ট এ সম্পর্কে বিভিন্ন ভুল বোঝার ব্যাখ্যা করে:

স্পষ্টভাবে ডেস্ট্রাক্টরকে কল করবেন না

এটি ডেস্ট্রাক্টর কীভাবে কাজ করে সে সম্পর্কে বেশ কয়েকটি ভুল ধারণা ধারণ করে। এটিকে স্পষ্টভাবে কল করা পিএইচপি 5 ডক অনুসারে আপনার পরিবর্তনশীলটিকে ধ্বংস করবে না:

পিএইচপি 5 অন্যান্য অবজেক্ট-ভিত্তিক ভাষার মতো সি ++ এর মতোই একটি ডেস্ট্রাক্টর ধারণাটি উপস্থাপন করে। কোনও নির্দিষ্ট অবজেক্টের বা শাটডাউন ক্রমের সময় কোনও ক্রমে অন্য কোনও রেফারেন্স না পাওয়া মাত্রই ডেস্ট্রাক্টর পদ্ধতিটি কল করা হবে।

উপরের পোস্টে উল্লেখ করা হয়েছে যে নালকে পরিবর্তনশীল সেট করা কিছু ক্ষেত্রে কাজ করতে পারে, যতক্ষণ না অন্য কিছু বরাদ্দ মেমরিটির দিকে নির্দেশ করে না।


2

সংক্ষিপ্ত উত্তর: উভয় প্রয়োজন।

আমার মনে হচ্ছে সঠিক উত্তরটি দেওয়া হয়েছিল তবে স্বল্প পরিমাণে। হ্যাঁ সাধারণত গতিবিহীন () "গতি" এর জন্য সেরা তবে আপনি যদি মেমরিটি তাত্ক্ষণিকভাবে দাবি করতে চান (সিপিইউয়ের দামে) নাল ব্যবহার করতে চান।

উল্লিখিত অন্যদের মতো, নালায় সেট করার অর্থ এই নয় যে সবকিছু পুনরুদ্ধার করা হয়েছে, আপনি ভাগ করে নেওয়া মেমরি (অনাবৃত) বস্তু থাকতে পারেন যা বস্তুর ধ্বংসকে আটকাবে। তদ্ব্যতীত, অন্যরা যেমন বলেছে, আপনি কোনওভাবেই অবজেক্টগুলিকে স্পষ্টভাবে "ধ্বংস" করতে পারবেন না যাতে আপনার এটি আর যাইহোক করার চেষ্টা করা উচিত নয়।

আপনার জন্য কোনটি সর্বোত্তম তা নির্ধারণ করতে হবে। এছাড়াও আপনি___ ডিস্ট্রাক্ট () ব্যবহার করতে পারেন এমন কোনও জিনিসের জন্য যা আনসেট বা নালায় ডাকা হবে তবে এটি সাবধানে ব্যবহার করা উচিত এবং অন্যদের মতো, কখনও কখনও সরাসরি ডাকা হবে না!

দেখা:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

NULL এবং আনসেট নির্ধারণের মধ্যে পার্থক্য কী?


0

এটি একটি সহজ প্রমাণ যে আপনি কোনও বিষয়টিকে ধ্বংস করতে পারবেন না, আপনি কেবল এটির কোনও লিঙ্ক নষ্ট করতে পারেন।

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

আয়

2

এটি এখানে কর্মে দেখুন: https://eval.in/1054130


3
ঠিক আছে, আপনি ধ্বংস করেছেন $var2যা একটি উল্লেখ ছিল $var। এখন $varআপনিও ধ্বংস করে ফেলুন এবং ধারণা করছেন যে বস্তুর উপরে অন্য কোনও রেফারেন্স নেই, আপনি শেষ করেছেন।
i336_

4
আপনি কোনও বস্তু ধ্বংস করছেন না, আপনি বস্তুর পয়েন্টারটি ধ্বংস করছেন। এটি একটি বড় পার্থক্য।
ইয়েভেগেনি আফানসিয়েভ

1
অন্যান্য ভাষায় আপনি কোনও জিনিসটি ধ্বংস করতে পারেন এবং অন্য সমস্ত পয়েন্টারগুলি আপনাকে ব্যতিক্রম বা আবর্জনা দেবে, তবে পিএইচপি
ইয়েভেগেনি আফানসিয়েভ

1
আপনি ধ্বংস করতে পারবেন না। যদি অবজেক্টটি ধারণ করে কোন রেফারেন্স না থাকে তবে আবর্জনা আবর্জনা সংগ্রহকারী সংগ্রহ করতে প্রস্তুত। এবং আপনি জঞ্জাল সংগ্রহকারী চালাতে বাধ্য করতে পারবেন না।
ড্যানিয়েল

0

এমন পরিস্থিতিতে হতে পারে যেখানে আপনি একটি নতুন মাইসকিলি অবজেক্ট তৈরি করছেন।

$MyConnection = new mysqli($hn, $un, $pw, $db);

তবে আপনি অবজেক্টটি বন্ধ করার পরেও

$MyConnection->close();

আপনি যদি print_r()বিষয়বস্তু পরীক্ষা করতে ব্যবহার করবেন$MyConnection নীচের মতো একটি ত্রুটি পাবেন:

Error:
mysqli Object

Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)

যে ক্ষেত্রে আপনি ব্যবহার করতে পারবেন না unlink()কারণunlink() একটি পাথ নামের স্ট্রিংয়ের প্রয়োজন হবে তবে এই ক্ষেত্রে $MyConnectionএকটি অবজেক্ট।

সুতরাং এর মানটি বাতিল করতে আপনার আরেকটি পছন্দ রয়েছে:

$MyConnection = null;

যেমনটি আপনি প্রত্যাশা করেছেন এখন জিনিস ঠিক চলছে। ভেরিয়েবলের ভিতরে আপনার কোনও সামগ্রী নেই$MyConnection পাশাপাশি আপনি ইতিমধ্যে মাইসকিলি অবজেক্টটি পরিষ্কার করেছেন।

আপনার ভেরিয়েবলের মান সেট করার আগে অবজেক্টটি বন্ধ করার প্রস্তাব দেওয়া অনুশীলন null


-7

আমি আনসেট না করে যাব কারণ এটি আবর্জনা সংগ্রহকারীকে আরও ভাল ইঙ্গিত দিতে পারে যাতে স্মৃতি শীঘ্রই আবার পাওয়া যায়। সাবধান থাকুন যে জিনিসটি যে কোনও জিনিসটিকে অন্য রেফারেন্সগুলি দেখায় বা প্রথমে আনসেট আনতে না পারে বা আপনাকে সত্যিই আবর্জনা সংগ্রাহকের জন্য অপেক্ষা করতে হবে যেহেতু তখন তাদের কোনও হ্যান্ডেল নেই।


16
আপনার উত্তরগুলি ব্যাক আপ করার জন্য যদি আপনার কাছে আসলে উত্স না থাকে তবে আপনার সম্ভবত সম্ভবত যা হতে পারে তা পোস্ট করা উচিত নয়। এটি কার্যকর নয় এবং এই ধরণের ভুল তথ্যকে সত্য হিসাবে গ্রহণ করা এবং পুনরাবৃত্তি করার দিকে পরিচালিত করে।
মেগার

1
@ মায়াগার এটি হ'ল কারণ হ'ল আমি অফিসিয়াল ম্যানুয়াল পৃষ্ঠায় লিঙ্ক করেছি যেখানে মন্তব্যগুলিতে, আনসেট () বাতিল করার সাথে তুলনা করার একটি নমুনা পরীক্ষা রয়েছে।
ফ্রাঙ্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.