ফাংশনে পিএইচপি গ্লোবাল


100

গ্লোবাল কীওয়ার্ডের ইউটিলিটি কী ?

একটি পদ্ধতি অন্য পদ্ধতির পছন্দ করার কোনও কারণ আছে?

  • সিকিউরিটি?
  • কর্মক্ষমতা?
  • আর কিছু?

পদ্ধতি 1:

function exempleConcat($str1, $str2)
{
  return $str1.$str2;
}

পদ্ধতি 2:

function exempleConcat()
{
  global $str1, $str2;
  return $str1.$str2;
}

এটি কখন ব্যবহার করা যায় global?

আমার কাছে এটি বিপজ্জনক বলে মনে হচ্ছে ... তবে এটি কেবল জ্ঞানের অভাব হতে পারে। আমি নথিভুক্তিতে আগ্রহী (যেমন কোডের উদাহরণ সহ, ডকুমেন্টেশনের লিঙ্ক ...) প্রযুক্তিগত কারণে।

আগাম ধন্যবাদ!


খয়রাত

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


2
এই লিঙ্কে কটাক্ষপাত আছে: stackoverflow.com/questions/1557787 এই পৃষ্ঠার নীচের অংশে অবস্থিত ডানদিকে সম্পর্কিত নিবন্ধ অনেক
JohnP

এটি আপনার প্রশ্নের সরাসরি উত্তর নয় তবে দয়া করে এই পুরানো এসও প্রশ্নটি পড়ুন
ইলফুর ওয়েজ

1
সুতরাং, আমি কোনও প্রো-গ্লোবাল কীওয়ার্ডটি পড়তে পারি না। 1) এটি এখানে কেন। ২) লোকেরা কেন এটি ব্যবহার করে?
পাস্কেল কিউই

@ জি.কিউ কেন আছে goto? লোকেরা কেন এটি ব্যবহার করে? তারা এটি ব্যবহার করবেন না (আমি কমপক্ষে আশা করি): পি
পিহহা

গত বছরের শেষে (14 ডিসেম্বর), কেউ এই প্রশ্নটিকে হ্রাস করেছে। আমি কেন তা জানতে আগ্রহী, কারণ নেতিবাচক বিষয়গুলি সহ সমস্ত দৃষ্টিভঙ্গি আকর্ষণীয়। এক্ষেত্রে আগের চেয়ে বেশি! আমি এটি সম্পর্কে কোনও ক্লু জন্য খুব কৃতজ্ঞ।
পাস্কেল কিউই

উত্তর:


158

গ্লোবাল মন্দ

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

function fn()
{
    global $foo;              // never ever use that
    $a = SOME_CONSTANT        // do not use that
    $b = Foo::SOME_CONSTANT;  // do not use that unless self::
    $c = $GLOBALS['foo'];     // incl. any other superglobal ($_GET, …)
    $d = Foo::bar();          // any static call, incl. Singletons and Registries
}

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

সুপারগ্লোবালগুলি ব্যবহার করা সুস্পষ্ট ত্রুটি নাও হতে পারে তবে আপনি যদি কোনও কমান্ড লাইন থেকে আপনার কোডটি কল করেন, আপনার কাছে নেই $_GETবা আছে $_POST। যদি আপনার কোডগুলি এগুলি থেকে ইনপুট উপর নির্ভর করে তবে আপনি নিজেকে একটি ওয়েব পরিবেশে সীমাবদ্ধ করছেন। অনুরোধটিকে কেবল কোনও বস্তুর মধ্যে বিমূর্ত করুন এবং পরিবর্তে এটি ব্যবহার করুন।

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

উপরের সকলের দ্বারা পুনঃব্যবহার তীব্রভাবে বাধাগ্রস্ত হয়। ইউনিট-টেস্টিং হয়

এছাড়াও, আপনি যখন বিশ্বব্যাপী সুযোগে দম্পতি হন তখন আপনার ফাংশন স্বাক্ষরগুলি মিথ্যা থাকে

function fn()

এটি মিথ্যাবাদী, কারণ এটি দাবি করে যে আমি সেই ফাংশনটিতে কিছু না দিয়েই কল করতে পারি। আমি যখন ফাংশন বডিটি দেখি তখনই আমি শিখি যে আমাকে পরিবেশকে একটি নির্দিষ্ট অবস্থায় স্থাপন করতে হবে।

যদি আপনার ক্রিয়াকলাপটি চালানোর জন্য আর্গুমেন্টগুলির প্রয়োজন হয়, তাদের সুস্পষ্ট করুন এবং এগুলিতে পাস করুন:

function fn($arg1, $arg2)
{
    // do sth with $arguments
}

স্বাক্ষর থেকে কী বলা প্রয়োজন তা স্পষ্টভাবে জানায়। এটি কোনও নির্দিষ্ট অবস্থায় থাকা পরিবেশের উপর নির্ভর করে না। আপনাকে করতে হবে না

$arg1 = 'foo';
$arg2 = 'bar';
fn();

এটি (গ্লোবাল কীওয়ার্ড) বনাম পুশিং ইন (আর্গুমেন্ট) এ টান দেওয়ার বিষয়। আপনি যখন নির্ভরতা ইনজেকশন / ইনজেকশন করেন তখন ফাংশনটি আর বাইরের উপর নির্ভর করে না। আপনি যখন করবেন না তখন fn(1)বাইরে কোথাও একটি ভেরিয়েবল হোল্ড থাকতে হবে। তবে আপনি যখন $oneফাংশনের অভ্যন্তরে বৈশ্বিক দিকে টানেন, আপনি বিশ্বব্যাপী সুযোগে দম্পতি হন এবং এটি কোথাও সংজ্ঞায়িত এর পরিবর্তক হওয়ার আশা করেন। ফাংশনটি তখন আর স্বাধীন হয় না।

আরও খারাপ, যখন আপনি নিজের ফাংশনের অভ্যন্তরে গ্লোবালগুলি পরিবর্তন করছেন, তখন আপনার কোডটি দ্রুত সম্পূর্ণ বোধগম্য হবে, কারণ আপনার ফাংশনগুলিতে সমস্ত জায়গাতেই পার্শ্ব প্রতিক্রিয়া রয়েছে।

এর চেয়ে ভাল উদাহরণের অভাবে বিবেচনা করুন

function fn()
{
    global $foo;
    echo $foo;     // side effect: echo'ing
    $foo = 'bar';  // side effect: changing
}

এবং তারপর আপনি কি

$foo = 'foo';
fn(); // prints foo
fn(); // prints bar <-- WTF!!

$fooএই তিনটি লাইন থেকে যে পরিবর্তন হয়েছে তা দেখার কোনও উপায় নেই । হঠাৎ করেই একই আর্গুমেন্টের সাথে একই ক্রিয়াকলাপটি কেন এটির আউটপুট পরিবর্তন বা বিশ্বব্যাপী কোনও মান পরিবর্তন করবে? একটি ফাংশনটি একটি সংজ্ঞায়িত ইনপুট ওয়াইয়ের জন্য এক্স করা উচিত Always সর্বদা।

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

আরও সংস্থানসমূহ:


10
পিএইচপি কেন এই জাতীয় বাস্তবায়ন করে? কোন ইউটিলিটি আছে? আমি সর্বদা পিএইচপি-তে বিপজ্জনক বাস্তবায়ন দেখে অবাক হয়েছি যে প্রচুর লোক প্রতিবার ব্যবহার করে ... কোনও যৌক্তিক কারণ নেই বলে বিশ্বাস করা আমার পক্ষে কঠিন!
পাস্কেল কিউই

5
আমি আশা করি আপনি গ্লোবালগুলি খারাপ আরও বড় করতে পারেন ।
কেরমিট

3
বাহ, অবশেষে কেউ বিশ্বব্যাপী কেন খারাপ তা ভালভাবে ব্যাখ্যা করেছিল ... আমি সর্বদা শুনেছিলাম তারা ছিল এবং কেন আমি খুব খুব নির্দিষ্ট উদাহরণ দেখেছি তবে এটি সাধারণ কারণগুলির জন্য এটি সত্যিই একটি ভাল এবং ব্যাপক ব্যাখ্যা। +1
উইংব্ল্যাড

আমি সত্যিই দেরি করেছি, এবং আমি কী বলছি তা আমি বুঝতে পারি তবে মাইএসকিলি সংযোগগুলি কীভাবে হয়? সেগুলি প্রতিবার প্যারামিটার হিসাবে পাস করা উচিত, বা একটি বিশ্বব্যাপী $ লিঙ্ক; আপনার চোখে অনুমতি দেওয়া?
মাভ

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

35

এর বিপরীতে একটি বড় কারণ globalহ'ল এর অর্থ এটি হল যে ফাংশনটি অন্য স্কোপের উপর নির্ভরশীল। এটি খুব দ্রুত অগোছালো হয়ে যাবে।

$str1 = 'foo';
$str2 = 'bar';
$str3 = exampleConcat();

বনাম

$str = exampleConcat('foo', 'bar');

প্রয়োজন হয় $str1এবং $str2ফাংশনটি কাজ করার জন্য কলিং স্কোপে সেট আপ করা মানে আপনি অপ্রয়োজনীয় নির্ভরতা প্রবর্তন করেন। ফাংশনে পাশাপাশি নাম পরিবর্তন না করে আপনি আর এই সুযোগে এই ভেরিয়েবলগুলির নাম পরিবর্তন করতে পারবেন না এবং এর ফলে আপনি এই ফাংশনটি ব্যবহার করছেন এমন সমস্ত অন্যান্য স্কোপেও। আপনি আপনার পরিবর্তনশীল নামগুলি ট্র্যাক করে রাখার চেষ্টা করার সাথে সাথে এটি অচিরেই বিশৃঙ্খলায় রূপান্তরিত হয়।

globalএমনকি $dbসংস্থান হিসাবে বিশ্বব্যাপী জিনিস অন্তর্ভুক্ত জন্য একটি খারাপ প্যাটার্ন । সেখানে হবে দিন আসবে যখন আপনি নামান্তর করতে চান $dbকিন্তু কারণ আপনার পুরো আবেদন নামের উপর নির্ভর করে, করতে পারেন না।

যে কোনও অর্ধপথ জটিল অ্যাপ্লিকেশন লেখার জন্য ভেরিয়েবলের পরিসর সীমাবদ্ধ করা এবং পৃথক করা অপরিহার্য


1
আমি দুঃখিত, তবে কেন আমি অবশ্যই নাম পরিবর্তন করতে চাই $db? এটি পিডিও, সর্বত্র চলে গেছে। আমি আলাদাভাবে সংযোগের তথ্য আপডেট করতে পারলে কেন এটি পরিবর্তন করা হবে?
কেসি ডোয়েন

3
@ কেসিডি কারণ একদিন আপনি বুঝতে পেরেছেন যে নির্ভরতা ইঞ্জেকশনটি কতটা দুর্দান্ত এবং আপনার অ্যাপ্লিকেশনটিকে পুনর্গঠন করতে চান? একদিন তুমি কিছু অন্যান্য উপাদান সঙ্গে আপনার কাপড় সংহত করতে হবে আরো একটি বিশ্বব্যাপী ব্যবহার $dbপরিবর্তনশীল? কারণ একদিন আপনি ইউনিট টেস্টিং আবিষ্কার করবেন এবং তার জন্য একসময় একাধিক ডাটাবেস সংযোগ পরিচালনা করতে হবে? অনেক, অনেক কারণ।
মিথ্যা

35

গ্লোবালগুলি অনিবার্য।

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

জেন্ডের এই কোডটি একবার দেখুন - এবং দয়া করে বুঝতে পারেন যে আমি জেন্ডকে খারাপভাবে লেখা হয়েছে বলে প্রস্তাব করি না:

class DecoratorPluginManager extends AbstractPluginManager
{
/**
 * Default set of decorators
 *
 * @var array
 */
protected $invokableClasses = array(
    'htmlcloud' => 'Zend\Tag\Cloud\Decorator\HtmlCloud',
    'htmltag'   => 'Zend\Tag\Cloud\Decorator\HtmlTag',
    'tag'       => 'Zend\Tag\Cloud\Decorator\HtmlTag',
   );

এখানে অনেকগুলি অদৃশ্য নির্ভরতা রয়েছে। এই ধ্রুবকগুলি আসলে ক্লাস। আপনি এই কাঠামোর কয়েকটি পৃষ্ঠায় প্রয়োজনীয়_অনসেসও দেখতে পারেন। প্রয়োজনীয়তা_অনসেস একটি বিশ্ব নির্ভরতা, সুতরাং বাহ্যিক নির্ভরতা তৈরি করে। এটি একটি কাঠামোর জন্য অনিবার্য। বহিরাগত কোডের উপর নির্ভর করে আপনি কীভাবে ডেকোরেটর প্লাগইনম্যানেজারের মতো শ্রেণি তৈরি করতে পারেন? এটি অতিরিক্ত অতিরিক্ত ছাড়া কাজ করতে পারে না। জেন্ডার কাঠামো ব্যবহার করে আপনি কি কখনও কোনও ইন্টারফেসের প্রয়োগ পরিবর্তন করেছেন? একটি ইন্টারফেস আসলে গ্লোবাল।

বিশ্বব্যাপী ব্যবহৃত আর একটি অ্যাপ্লিকেশন হ'ল দ্রুপাল। তারা যথাযথ নকশা সম্পর্কে খুব উদ্বিগ্ন, তবে যে কোনও বড় কাঠামোর মতো, তাদের প্রচুর বাহ্যিক নির্ভরতা রয়েছে। এই পৃষ্ঠায় গ্লোবালগুলি দেখুন:

/**
 * @file
 * Initiates a browser-based installation of Drupal.
 */

/**
 * Root directory of Drupal installation.
 */
define('DRUPAL_ROOT', getcwd());

/**
 * Global flag to indicate that site is in installation mode.
 */
define('MAINTENANCE_MODE', 'install');

// Exit early if running an incompatible PHP version to avoid fatal errors.
if (version_compare(PHP_VERSION, '5.2.4') < 0) {
  print 'Your PHP installation is too old. Drupal requires at least PHP 5.2.4. See the     <a     href="http://drupal.org/requirements">system requirements</a> page for more     information.';
  exit;
}

// Start the installer.
require_once DRUPAL_ROOT . '/includes/install.core.inc';
install_drupal();

কখনও লগইন পৃষ্ঠায় একটি পুনর্নির্দেশ লিখেছেন? এটি একটি বিশ্বব্যাপী মান পরিবর্তন করছে। (এবং তারপরে আপনি কি 'ডব্লিউটিএফ' বলছেন না, যা আমি আপনার অ্যাপ্লিকেশনটির খারাপ ডকুমেন্টেশনের পক্ষে ভাল প্রতিক্রিয়া হিসাবে বিবেচনা করি)) গ্লোবালগুলির সমস্যা এটি নয় যে তারা গ্লোবাল, অর্থপূর্ণ প্রয়োগের জন্য আপনার এগুলি প্রয়োজন। সমস্যাটি হ'ল সামগ্রিক প্রয়োগের জটিলতা যা এটি পরিচালনা করতে একটি দুঃস্বপ্ন করতে পারে। অধিবেশনগুলি বিশ্বব্যাপী, _P _POST একটি বিশ্বব্যাপী, DRUPAL_ROOT একটি বিশ্বব্যাপী, অন্তর্ভুক্ত / install.core.inc 'একটি অপরিবর্তনীয় গ্লোবাল। যে ফাংশনটি তার কাজটি চালাতে দেয় সে জন্য প্রয়োজনীয় যে কোনও ফাংশনের বাইরেও বড় বিশ্ব রয়েছে।

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

function xzy($var){
 global $z;
 $z = $var;
}

function setZ($var){
 $this->z = $var;
}

উভয় দৃষ্টিতে একটি নির্দিষ্ট ফাংশনের মধ্যে $ z এর মান পরিবর্তিত হয়। প্রোগ্রামিংয়ের উভয় উপায়ে আপনি কোডগুলিতে অন্যান্য জায়গাগুলির একগুচ্ছ পরিবর্তন করতে পারেন। আপনি বলতে পারেন যে গ্লোবাল ব্যবহার করে আপনি যেকোন জায়গায় $ z কল করতে এবং সেখানে পরিবর্তন করতে পারেন। হ্যা, তুমি পারো. তবে কি করবে? এবং যখন ইনপুট জায়গায় করা হয়, তখন এটি কি বাগ বলা উচিত নয়?

জিজিফার সম্পর্কে বব ফ্যাঙ্গার মন্তব্য করেছেন।

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

গ্লোবাল এবং কীওয়ার্ড গ্লোবাল এবং কখন কী ওয়ার্ডের সাথে কাজ করার সমস্যা আছে তা আরও বুঝতে এবং পরের বাক্যটি কখন প্রবর্তন করব না, যা ব্লগ সম্পর্কে লেখার সময় উইম ডি বিয়ের কাছ থেকে আসে: 'ব্যক্তিগত হ্যাঁ, ব্যক্তিগত নম্বর নয়'। যখন কোনও ফাংশন তার নিজস্ব ক্রিয়াকলাপের জন্য কোনও গ্লোবাল ভেরিয়েবলের মান পরিবর্তন করে, তখন আমি সেই বিশ্বব্যাপী ভেরিয়েবল এবং বাগের ব্যক্তিগত ব্যবহারটিকে কল করব। লগইন পৃষ্ঠায় ব্যবহারকারীর পুনঃনির্দেশের মতো সামগ্রিকভাবে অ্যাপ্লিকেশনটির যথাযথ প্রক্রিয়াকরণের জন্য যখন গ্লোবাল ভেরিয়েবলের পরিবর্তন করা হয়, তখন আমার মতামতটি সম্ভবত ভাল ডিজাইন, সংজ্ঞা দ্বারা খারাপ নয় এবং অবশ্যই একটি নয় বিরোধী প্যাটার্ন।

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


ড্রুপাল কোড নমুনা গ্লোবাল ব্যবহার করে না, এটি ধ্রুবক ব্যবহার করে। একটি খুব গুরুত্বপূর্ণ পার্থক্য হ'ল ধ্রুবকটিকে একবার সংজ্ঞায়িত করা হলে এটি পুনরায় সংজ্ঞায়িত করা যায় না। এছাড়াও আপনি কেবল ফাংশন xyzএবং তুলনা করতে পারবেন না setZ। প্রথমটি বিশ্বব্যাপী রাষ্ট্র পরিবর্তন করে, দ্বিতীয়টি একটি শ্রেণিবদ্ধ পদ্ধতি এবং এটির পরিবর্তিত পরিস্থিতি কেবল পরিবর্তিত হয়।
আরজান

@ আরজেন: আপনি যদি ড্রপাল .1.১৪-তে কীওয়ার্ড গ্লোবালটি অনুসন্ধান করেন তবে শত শত হিট পাবেন। এটি সর্বজনীন সেটেটরগুলির ক্ষেত্রে একটি পুরানো সমস্যা: আপনি একবার সর্বজনীন করার পরে তারা যেখানে পরিবর্তন হয় সেই স্থানটি আপনি নিয়ন্ত্রণ করতে পারবেন না। এগুলি মোটেই ব্যবহার না করার বা তাদের ব্যক্তিগত ঘোষণা করার পরামর্শ দেওয়া হয়েছে, যাতে এটি পরে যুক্ত করা যায় না।
লোকে বার্গম্যান

@ আরজান: আপনার নামের বানান নিয়ে আমার ত্রুটির কারণে আপনি আমার প্রতিক্রিয়াটির কোনও বিজ্ঞপ্তি পান নি। এখন আপনি হবে। :-)
লৌক বার্গম্যান

@ লৌকবার্গম্যান: ড্রুপাল global7.২6 (যা সর্বশেষতম সংস্করণ) এর শব্দের জন্য প্রায় ৪০০ টি হিট রয়েছে, সেগুলির মধ্যে কয়েকটি হিট মন্তব্যে রয়েছে এবং বেশ কয়েকটি অন্যান্য কোড হিসাবে দেখা যাচ্ছে যা বছরের পর বছর স্পর্শ করা হয়নি। আমি নিশ্চিত আশা করি তারা global8 টি ড্রুপাল 8 এ ব্যবহার করবে না
আরজান

@ লৌকবার্গম্যান দয়া করে সেটার এবং গিটারগুলি ব্যবহার করুন। এটি সেট আপ করতে বেশি সময় নেয় না এবং অন্যরা যারা আপনার কোড ব্যবহার করছে এবং সম্ভবত আপনার ক্লাসগুলি আরও নিয়ন্ত্রণ করতে তাদেরকে অনুমতি দেয়। একবার আপনি একটি প্যারামিটার তৈরি করার পরে এটি তা শুরু করে। আপনার এটি পরে লুকানোর বিকল্প নেই।
এমএএসটি

15

সহজ কথায় বলতে globalগেলে আধুনিক পিএইচপি কোড আইএমএইচও-তে খুব ভাল কারণ হওয়ার খুব কম কারণ রয়েছে । বিশেষত যদি আপনি পিএইচপি 5 ব্যবহার করে থাকেন এবং যদি আপনি অবজেক্ট ওরিয়েন্টেট কোডটি বিকাশ করেন তবে অতিরিক্ত বিশেষ।

গ্লোবালগুলি কোডের রক্ষণাবেক্ষণযোগ্যতা, পাঠযোগ্যতা এবং টেস্টিবিলিটিটিকে নেতিবাচকভাবে প্রভাবিত করে। ক্যান এর অনেকগুলি ব্যবহার globalনির্ভরতা ইনজেকশন দ্বারা প্রতিস্থাপন করা উচিত বা কেবলমাত্র প্যারামিটার হিসাবে গ্লোবাল অবজেক্টটি পাস করা উচিত।

function getCustomer($db, $id) {
    $row = $db->fetchRow('SELECT * FROM customer WHERE id = '.$db->quote($id));
    return $row;
}

10

পিএইচপি-তে ফাংশনের অভ্যন্তরে গ্লোবাল কীওয়ার্ড ব্যবহার করা থেকে দ্বিধা করবেন না। বিশেষত এমন লোকদের গ্রহণ করবেন না যারা গ্লোবালগুলি কীভাবে 'দুষ্ট' এবং কী নয় তা বিদেশীভাবে প্রচার / চিৎকার করছে।

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

বিন্দু ক্ষেত্রে :

ওয়ার্ডপ্রেস এবং এর ইকোসিস্টেম তাদের ফাংশনগুলিতে গ্লোবাল কীওয়ার্ড ব্যবহার করে। কোডটি ওওপি হোক বা ওওপি নয় not

এবং এখন পর্যন্ত ওয়ার্ডপ্রেসটি মূলত ইন্টারনেটের 18.9%, এবং এটি রয়টার্স থেকে সনি, এনওয়াইটি, সিএনএন থেকে শুরু করে অগণিত দৈত্যগুলির বিশাল ম্যাগসাইট / অ্যাপস চালাচ্ছে।

এবং এটি ভাল করে।

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

এমন লোকেরা থাকতে পারে যারা ওয়ার্ডপ্রেস, এর বাস্তুতন্ত্র, তাদের অনুশীলন এবং those অংশগুলিতে কী ঘটেছিল সমালোচনা করে।

অর্থহীন, যেহেতু এই বাস্তুতন্ত্রটি প্রায় পুরো ইন্টারনেটের প্রায় 20% 20 স্পষ্টতই, এটি কাজ করে, এটি তার কাজ এবং আরও অনেক কিছু করে। যার অর্থ এটি বিশ্বব্যাপী কীওয়ার্ডের জন্য একই।

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

......

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

তবে সংখ্যাগরিষ্ঠদের জন্য এটি পৃথিবী একটি চিরচেনা বিশ্ব যা তারা খোলামেলা এবং ব্যবহারিক হওয়া প্রয়োজন। মৌলবাদের জন্য কোনও স্থান নেই, তথ্য প্রযুক্তির সামনের লাইনের খাঁজে 'অশুভ' জাতীয় আপত্তিজনক কীওয়ার্ডগুলি বাদ দিন aside

কাছাকাছি, মাঝারি এবং দীর্ঘমেয়াদী ভবিষ্যতের জন্য উপযুক্ত বিবেচনার সাথে এটিকে হ্যান্ড হ্যান্ড এ্যান্ডটি-র সমস্যার জন্য সর্বোত্তম ধারণা তৈরি করে কেবল তা ব্যবহার করুন। কোনও বৈশিষ্ট্য বা পদ্ধতির ব্যবহার থেকে বিরত থাকবেন না কারণ এতে প্রদত্ত যে কোনও কোডার সাবসেটের মধ্যে এর বিরুদ্ধে প্রচন্ড মতাদর্শগত বৈরিতা রয়েছে।

তারা আপনার কাজ করবে না। তুমি করবে আপনার পরিস্থিতি অনুসারে কাজ করুন।


3
মৌলবাদবিরোধী ও ++ এর জন্য +1, তবে কেবল "প্রচুর লোকেরা এটি ব্যবহার করে / এটি কাজ করে / ইত্যাদি" বলা কেবল একটি "আর্গুমেন্ট অ্যাড পপুলাম", একটি বেসিক সোফিজম। বেশিরভাগ লোক মনে করেন বা একটি কাজ করেন তা প্রমাণ করে না যে তারা ঠিক আছে! জনতার মধ্যে যদি কোনও বিপদ দেখা দেয় তবে বেশিরভাগ লোক বোকা কাজ করবে এবং কিছু লোক অন্যের দ্বারা পাথর মেরে মারা যাবে। তারা কি এই পাঁচ বছরের বাচ্চা মেয়েটির মুখের উপর পা রেখেছিল ঠিক যে কারণে তারা মনে করে যে তারা অবশ্যই একটি দরজা ধাক্কা দিতে হবে যা কেবল আগুনের হাত থেকে বাঁচতে টানলে খোলা থাকে? আমার মনে হয় না ...
পাস্কেল কিউ

1
সংখ্যাগরিষ্ঠ কিছু অবশ্যই নিজের দ্বারা বৈধতা দেয় না। তবে কেসটি সফটওয়্যার। এবং যদি সংখ্যাগরিষ্ঠ এটি করছে এবং এই লোকেরা তৈরি করা বেশিরভাগ অ্যাপ্লিকেশন এবং পরিষেবাদি ভালভাবে ধরে রয়েছে (অন্যদের কাছে ওয়ার্ডপ্রেস) তবে এর অর্থ হ'ল এগুলি ব্যবহার করা যেতে পারে।
ऐक 100100

7

আমি মনে করি সবাই বিশ্বব্যাপী নেতিবাচক দিকগুলি সম্পর্কে যথেষ্ট ব্যাখ্যা করেছে। সুতরাং আমি গ্লোবালগুলির যথাযথ ব্যবহারের জন্য ইতিবাচক পাশাপাশি নির্দেশাবলী যুক্ত করব:

  1. গ্লোবালগুলির মূল উদ্দেশ্য ছিল ফাংশনগুলির মধ্যে তথ্য ভাগ করা। ফিরে যখন ক্লাসের মতো কিছুই ছিল না, পিএইচপি কোডে একগুচ্ছ ফাংশন ছিল। কখনও কখনও আপনার ফাংশনগুলির মধ্যে তথ্য ভাগ করে নেওয়া দরকার। সাধারণত গ্লোবালটিকে বৈশ্বিক করে ডেটা দূষিত হওয়ার ঝুঁকি নিয়ে এটি করা হত।

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

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

  2. গ্লোবালগুলির জন্য অন্য ব্যবহার হ'ল কনফিগারেশনের উদ্দেশ্যে। মূলত কোনও স্ক্রিপ্টের শুরুতে কোনও অটোলোডার লোড হওয়ার আগে, ডাটাবেস সংযোগ তৈরি করা ইত্যাদি

    সংস্থানগুলি লোড করার সময়, গ্লোবালগুলি ডেটা কনফিগার করতে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ লাইব্রেরি ফাইলগুলি কোথায় অবস্থিত কোন ডাটাবেস, সার্ভারের ইউআরএল ইত্যাদি)। এটি করার সর্বোত্তম উপায় হ'ল define()ফাংশনটি ব্যবহার করা যেহেতু এই মানগুলি প্রায়শই পরিবর্তিত হয় না এবং সহজেই একটি কনফিগারেশন ফাইলে স্থাপন করা যায়।

  3. গ্লোবালগুলির জন্য চূড়ান্ত ব্যবহার হ'ল সাধারণ ডেটা (যেমন সিআরএলএফ, আইএমএফডিআরআইএমপিডিআরআইআরএল), মানব পঠনযোগ্য স্থিতি পতাকাগুলি (যেমন আইটিআইটিআর_আইএসএলসিআরসিআইভি) hold এখানে গ্লোবালগুলি তথ্য সংরক্ষণের জন্য ব্যবহার করা হয় যা বোঝাতে ব্যবহৃত হয় অ্যাপ্লিকেশন ওয়াইড যাতে তাদের পরিবর্তন করা যায় এবং সেই পরিবর্তনগুলি অ্যাপ্লিকেশনটিতে প্রশস্তভাবে উপস্থিত হয়।

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

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

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

সুতরাং উপসংহারে আপনি যদি 1, 2 বা 3 পজিশনে থাকেন তবে গ্লোবাল ব্যবহার করা যুক্তিসঙ্গত হবে। তবে অন্যান্য পরিস্থিতিতে 1 পদ্ধতিটি ব্যবহার করা উচিত।

গ্লোবালগুলি ব্যবহার করা উচিত যেখানে অন্য কোনও দৃষ্টান্ত নির্দ্বিধায় জানুন।


6

গ্লোবাল কীওয়ার্ড ব্যবহার করে একটি কনক্যাট ফাংশন করা কোনও অর্থবোধ করে না।

এটি ডাটাবেস অবজেক্টের মতো গ্লোবাল ভেরিয়েবল অ্যাক্সেস করতে ব্যবহৃত হয়।

উদাহরণ:

function getCustomer($id) {
  global $db;
  $row = $db->fetchRow('SELECT * FROM customer WHERE id = '.$db->quote($id));
  return $row;
}

এটি সিঙ্গলটন প্যাটার্নে প্রকরণ হিসাবে ব্যবহার করা যেতে পারে


"এটি কোনও অর্থবোধ করে না" - আসলে এটি করে: উদাহরণটি OOP ব্যবহার না করে একটি সন্ধানের টেবিল প্রয়োগ করবে।
নীর আলফাসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.