কীভাবে বিশ্বব্যাপী ভেরিয়েবলগুলি সেট এবং ব্যবহার করবেন? বা কেন এগুলি মোটেই ব্যবহার করবেন না


27

আপডেট: আমার আসল প্রশ্নটি সমাধান হয়ে গেছে, তবে এটি কেন বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহার করবেন না সে সম্পর্কে একটি বৈধ আলোচনায় রূপান্তরিত হচ্ছে, তাই আমি সেটিকে প্রতিফলিত করতে প্রশ্নটি আপডেট করছি। সমাধানটি <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>@ টমজেউউউলের পরামর্শ অনুসারে ছিল।

আপডেট 2: আমি এখন যা করতে চাইছিলাম ঠিক তাই করছে। তবে আমি এখনও বিশ্বব্যাপী সুযোগ ব্যবহার করছি এবং আরও ভাল উপায় খুঁজে পেয়ে খুশি হব।

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

এইভাবে আমি বর্তমানে এগুলি তৈরি করছি (আমি কেবল কয়েকটি ভেরিয়েবলের মধ্যে পেস্ট করেছি)।

function set_global_nav_var()
{
    //proposal
    global $prop;
    // Get the ID of a given category
    $category_id_prop = get_cat_ID( 'proposal' );
    // Get the URL of this category
    $category_link_prop = get_category_link( $category_id_prop );
    $prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';

    //Calvinball
    global $cb;
    // Get the ID of a given category
    $category_id_cb = get_cat_ID( 'calvinball' );
    // Get the URL of this category
    $category_link_cb = get_category_link( $category_id_cb );
    $cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );

আমি এখন <?php global $prop; echo $prop; ?>সে 4 টি জায়গায় যেতে পারি যা যায় এবং কোডের জন্য পুরো লিঙ্কটি ফিরে পায়। যখন এটি পরিবর্তন হয় আমি কেবল এটি এক জায়গায় পরিবর্তন করতে পারি। আমি বিশ্বব্যাপী সুযোগ জড়িত না এমন বিকল্পগুলির জন্য উন্মুক্ত।


1
এই বিবৃতিটি কোন লিঙ্কটি প্রতিবেদন করে এস্ক_আরল ($ বিভাগ_লিঙ্ক_প্রপ); প্রদর্শন? আপনার প্রত্যাশিত লিঙ্কটি কী?
বিনোদদলভি

1
আপনি কেন কেবল 'get_cat_ID (****)' ব্যবহার করবেন না যেখানে আপনি বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করার পরিকল্পনা করেছিলেন। আমি সন্দেহ করি আপনার কাজটি করার সাথে সাথে কোনও গতির সুবিধা হবে। পঠনযোগ্যতার দৃষ্টিকোণ থেকে 'get_cat_ID (****)' হাত জিতল।
ক্রিস স্ট্রুটন

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

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

2
এমন কোনও ফাংশন তৈরি করুন যা আপনার মেনুটিকে যে প্রসঙ্গে পাঠিয়েছে তার উপর ভিত্তি করে আউটপুট দেয়, এইভাবে আপনি সমস্ত মেনু যুক্তিকে যুক্ত করতে পারেন এবং সম্পর্কিত ভার্সগুলি এক জায়গায় আবদ্ধ করতে পারেন।
মিলো

উত্তর:


21

যদিও আমি এর বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিচ্ছি এবং এটি জিনিসগুলিকে গতি বাড়িয়ে তুলবে না, তবে আপনার ব্যবহারটি ভুল।

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

যেমন ফাংশন.এফপি:

function test() {
    global $hello;
    $hello = 'hello world';
}
add_action( 'after_theme_setup', 'test' );

সিঙ্গল.এফপি-তে, এটি কাজ করবে না:

echo $hello;

কারণ $ হ্যালো অনির্ধারিত। এটি তবে হবে কাজ :

global $hello;
echo $hello;

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

আপনি কাঠামোগত ডেটা যেমন অবজেক্টস বা নির্ভরতা ইনজেকশন, বা আপনার ক্ষেত্রে, ফাংশনের একটি সেট ব্যবহার করা ভাল।

উদাহরণস্বরূপ, এখানে স্থিতিশীল ভেরিয়েবলের মাধ্যমে অনুরূপ কিছু করার একটি মাধ্যম রয়েছে (একই কারণে এখনও খারাপ, তবে কেবল একটি সামান্য কিছুটা কম, এবং টাইপ করা সহজ) উদাহরণস্বরূপ

function awful_function( $new_hello='' ) {
    static $hello;
    if ( !empty( $new_hello ) ) {
        $hello = $new_hello;
    }
    return $hello;
}

awful_function( 'telephone' );
echo awful_function(); // prints telephone
awful_function( 'banana');
echo awful_function(); // prints banana

আপনি যদি পুনরায় ব্যবহারের জন্য কোথাও ডেটা সঞ্চয় করে সময় সাশ্রয় করতে চান তবে WP_Cacheসিস্টেম wp_cache_getইত্যাদি ব্যবহার করে বিবেচনা করুন


আমি জানি যে এটি বিশ্বব্যাপী সুযোগ ব্যবহার করার জন্য কিছুটা বাদাম, তবে বেশিরভাগ ক্ষেত্রে, যদি এই পৃষ্ঠাগুলির সমস্তই প্রতিটি পৃষ্ঠায় ব্যবহার করা হয় না। আমি আরও ভাল ধারণার জন্য উন্মুক্ত। আমি আমার উদ্দেশ্যটি আরও পরিষ্কার করার জন্য প্রশ্নটি সম্পাদনা করতে যাচ্ছি। বিটিডব্লিউটি <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>আপনার পরামর্শ অনুযায়ী আমি যখন এটি করি তখন এটি ঠিকঠাক কাজ করে । ধন্যবাদ!
জেপল্লক

2
আহ যদি আমার সমাধান কাজ করে তবে আপনি কি স্বীকৃত হিসাবে চিহ্নিত করতে পারবেন? আপনার গ্লোবাল ভেরিয়েবলগুলি আসল কল করার ঠিক তত দ্রুত, আপনি তার পরিবর্তে ফাংশনগুলি ব্যবহার করে দেখতে চাইতে পারেন যাতে আপনাকে 2 লাইন টাইপ করার দরকার নেই, আরও ভাল, একটি সিঙ্গলটন, আরও ভাল, সমস্ত গতিশীল এবং একটিতে get_template_part- এর মাধ্যমে টেমপ্লেট অংশ অন্তর্ভুক্ত করা হয়েছে
টম জে নওয়েল

আমি এখন যা করছি তা হিসাবে এটি গ্রহণযোগ্য হিসাবে চিহ্নিত হয়েছে যদিও আমি নীচের পরামর্শ দিচ্ছি @ মার্কক্যাপলুন যে কোনও কৌশল নিয়ে যেতে পারি। Get_template_part () ব্যবহার করা একটি আকর্ষণীয় ধারণা, তবে আমি নিশ্চিত নই যে আমি এর মতো সংক্ষিপ্ত ফাইলগুলিতে একটি দির রাখতে চাই ...
জেপললক

ওহ, না আপনি প্রতিটি বিভাগের জন্য একটি ফাইল চাইবেন না, আপনি কেবল এমন একটি চাইবেন যা বর্তমান বিভাগের নামটি ধরে এবং এটি ব্যবহার করে। আপনার কোনও কিছু হার্ডকোড করার দরকার নেই, এগুলি হার্ডকোডিংয়ের ঝামেলা কল্পনা করুন
টম জে নওয়েল

আমি আমার চাইল্ড-ফাংশন.এফপিতে কোডটি রেখেছি যা সক্রিয়। তবে আমি একটি "সাধারণ" ডাটাবেস-উত্পন্ন পোস্ট থেকে কল করে পিএইচপি-অন্তর্ভুক্ত ফাইলটিতে ভেরিয়েবলটি অ্যাক্সেস করতে পারি না। দয়া করে আমাকে পরামর্শ দিন, আমি কী ভুল করব? (আমি অবশ্যই এটি বিশ্বব্যাপী হিসাবে সংজ্ঞায়িত করেছি))
ycc_swe

19

গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করুন না as

কেন গ্লোবাল ব্যবহার করবেন না

কারণ গ্লোবালগুলির ব্যবহার দীর্ঘমেয়াদে সফ্টওয়্যারটি বজায় রাখা আরও শক্ত করে তোলে।

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

ওয়ার্ডপ্রেস কোরের গ্লোবালগুলির ব্যবহারের অনেক উপায়ে রয়েছে। কীভাবে বেসিক ফাংশনগুলি the_contentকাজের মতো বোঝার চেষ্টা করার সময় আপনি হঠাৎ বুঝতে পারবেন যে এটি$more পরিবর্তনশীল স্থানীয় নয় তবে বৈশ্বিক এবং কখন এটি সত্য হয়ে যায় তা বোঝার জন্য পুরো মূল ফাইলগুলি অনুসন্ধান করতে হবে।

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

মিষ্টি ফাংশন। অনুলিপি / পেস্ট সংরক্ষণ করার জন্য এটি কেবল একটি মোড়ক / ম্যাক্রো

// input: $id - the category id
// returns: the foo2 value of the category
function notaglobal($id) {
  $a = foo1($id);
  $b = foo2($a);
  return $b;
}

সুবিধাগুলি হ'ল এখন প্রাক্তন গ্লোবাল যা করে তার একটি ডকুমেন্টেশন রয়েছে এবং যখন ডিবাগিংয়ের জন্য আপনার কাছে একটি স্পষ্ট পয়েন্ট আছে যখন মানটি প্রত্যাশিত হয় আপনি প্রত্যাশিত হন না।

আপনার কাছে সুইটনার হয়ে গেলে প্রয়োজনে ফলাফলটি ক্যাশে করা সহজ (যদি আপনি আবিষ্কার করেন যে এই ফাংশনটি কার্যকর করতে দীর্ঘ সময় লাগে)

function notaglobal($id) {
  static $cache;

  if (!isset($cache)) {
    $a = foo1($id);
    $b = foo2($a);
    $cache = $b;
  } 
  return $cache;
} 

এটি আপনাকে বৈশ্বিকের মতো একই আচরণ দেয় তবে প্রতিবার আপনি এটি অ্যাক্সেস করার সাথে সাথে একটি আশ্বাসপ্রাপ্ত সূচনা করার সুবিধা সহ।

আপনি ওওপি এর সাথে একই ধরণের থাকতে পারেন। আমি দেখতে পেয়েছি যে ওওপি সাধারণত প্লাগইন এবং থিমগুলিতে কোনও মান যুক্ত করে না, তবে এটি একটি আলাদা আলোচনা

class notaglobal {
   var latestfoo2;

   __constructor($id) {
     $a = foo1($id);
     $this->latestfoo2 = foo2($a)
   }
}

$v = new notaglobal($cat_id);
echo $v->latestfoo2;

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

আমি কোনও অবজেক্ট অ্যাট্রিবিউটটি সরাসরি অ্যাক্সেস করতে চাই না, সুতরাং আমার কোডে এটি আরও কিছুটা বাড়িয়ে দেবে

class notaglobal {
   var latestfoo2;

   __constructor() {}

   foo2($id) {  
     if (!isset($this->latestfoo2)) {    
       $a = foo1($id);
       $b = foo2($a);
       $this->latestfoo2= $b;
     } 
     return $this->latestfoo2;
   }
}

$v = new notaglobal();
echo $v->foo2($cat_id);

7
দয়া করে, চিৎকার করবে না । কেন ব্যাখ্যা এবং কিছু ধরণের প্রশংসা প্রদান মন?
brasofilo

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

1
আইএমও এটির একটি উত্তর, এখানে আসা লোকেরা গুগল গঠন করে দেখবেন যে এখনই গ্লোবালগুলি ব্যবহার করার বিষয়ে ভাবনা খারাপ ধারণা।
মার্ক কাপলুন

6
ডন ডো এক্স বলার পক্ষে যথেষ্ট নয়, আপনি কেন ব্যাখ্যা করছেন বা আপনার মতো মনে হচ্ছে আপনি এটি কোনও কৌতুক দিয়ে বলছেন
টম জে নওয়েল

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

8

আপনার প্রশ্নটি পিএইচপি কীভাবে কাজ করে তা জড়িত।

উদাহরণ হিসাবে $ wpdb নিন

p wpdb একটি সুপরিচিত গ্লোবাল ভেরিয়েবল।

আপনি কখন জানেন যে এটি কখন ঘোষণা করা হবে এবং মান সহ নির্ধারিত হবে?

প্রতিটি পৃষ্ঠা লোড , হ্যাঁ, প্রতিবার আপনি আপনার ওয়ার্ডপ্রেস সাইটটিতে যান।

একইভাবে, আপনাকে নিশ্চিত করতে হবে যে আপনি যে ভেরিয়েবলগুলি বিশ্বায়িত হতে চান তা ঘোষিত হবে এবং প্রতিটি পৃষ্ঠা লোড হওয়া সংশ্লিষ্ট মানগুলির সাথে নির্ধারিত হবে।

যদিও আমি কোনও থিম ডিজাইনার নই, আমি পরে_সেটআপ_থমে বলতে পারি এক সময়ের হুক। থিমটি সক্রিয় হলেই এটি ট্রিগার করা হবে।

আমি যদি আপনি থাকতাম তবে আমি আর ডি বা অন্যান্য হুক ব্যবহার করব। না, আমি যদি আপনি থাকতাম তবে আমি বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহার করতাম না ...

আমি জিনিস বোঝাতে আসলেই ভাল নই। সুতরাং, আপনি যদি পিএইচপি ব্যবহার করতে চান তবে আপনার একটি বই নেওয়া উচিত।


2

আপনি সর্বদা স্থির গেটের মাধ্যমে সিঙ্গলটন প্যাটার্ন ব্যবহার করতে পারেন।

<ul>
    <li><?php echo MyGlobals::get_nav_prop( 'proposal' )[ 'html' ]; ?></li>
    <li><?php echo MyGlobals::get_nav_prop( 'calvinball', 'html' ); ?></li>
</ul>


<?php

if ( ! class_exists('MyGlobals') ):

class MyGlobals {

    public $props;

    public function __construct(){
      $this->props = array (
        'proposal' => array( 'title' => 'Proposal', 'text' => 'Proposal' ),
        'calvinball' => array( 'title' => 'Calvinball', 'text' => 'Calvinball' ),
      );
    }

    public function get_nav_prop ( $term, $prop = false )
    {
      $o = self::instance();
      if ( ! isset( $o->props[$term] ) ) {  return falst; }
      if ( ! isset( $o->props[$term][ 'html' ] ) ) {
          $id = get_cat_ID( $term );
          $link = esc_url ( get_category_link( $id ) );
          $title = $o->props[$term]['title'];
          $text = $o->props[$term]['text'];
          $o->props[$term]['html'] = '<a href="'.$link.'" title="'.$title.'">'.$text.'</a>';
          $o->props[$term]['link'] = $link;
          $o->props[$term]['id'] = $id;
      }

      if($prop){ return isset($o->props[$term][$prop]) ? $o->props[$term][$prop] : null; }

      return $o->props[$term];
    }

    // -------------------------------------

    private static $_instance;

    public static function instance(){

      if(!isset(self::$_instance)) {
        self::$_instance = new MyGlobals();
      }
      return self::$_instance;
    }

}

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