পিএইচপি-তে স্ট্রিং হিসাবে একটি পরিবর্তনশীল নাম কীভাবে পাবেন?


201

বলুন আমার এই পিএইচপি কোড রয়েছে:

$FooBar = "a string";

আমার তখন এর মতো একটি ফাংশন প্রয়োজন:

print_var_name($FooBar);

যা প্রিন্ট করে:

FooBar

কোনও ধারণা কীভাবে এটি অর্জন করবেন? এটি কি পিএইচপি-তে সম্ভব?


9
আপনার যদি ডিবাগিং ছাড়া অন্য কোনও প্রয়োজন হয় তবে আপনি মারাত্মক কিছু ভুল করছেন। আপনার ব্যবহারের ক্ষেত্রে কী?
ট্রয়লসकन

10
ভাল প্রশ্ন. ডিবাগিংয়ের জন্য আমারও একই দরকার ছিল।
তাকেশিন

17
+1 - একটি মডেল পিএইচপি অবজেক্ট থেকে এক্সএমএল বা জেএসএন প্রতিক্রিয়াটি স্বয়ংক্রিয়ভাবে উত্পন্ন করার জন্য আমার এটির প্রয়োজন ছিল। অন্য নামযুক্ত rootName => modelObjectঅ্যারের মধ্যে অবজেক্টটি মোড়ানো কেবল প্রতিক্রিয়াতে অপ্রয়োজনীয় গভীরতা যুক্ত করে। আশা করি এটি ভাষার রানটাইম প্রতিবিম্ব ক্ষমতাগুলির মধ্যে বেক করা হয়েছে।
অনুরাগ

4
লগিং ফাংশনেও আমার এটির দরকার ছিল। আমি নিম্নলিখিতটি করতে সক্ষম হতে চাই: লগ ($DTheSstmBlowUp); লগ ফাইলে উপস্থিত হওয়ার জন্য যেমন: $TheTheSstmBlowUp = 'এখনও হয়নি, তবে খুব শীঘ্রই';
শানডাউন

4
এছাড়াও var_dump () কল করার সময় এটি কার্যকর হতে পারে তাই যখন আপনি বিভিন্ন ভেরিয়েবলের সাথে একই সাথে কল করেন তখন ভার্ডআপসের আউটপুটগুলির মধ্যে পার্থক্য করার জন্য ম্যানুয়ালি ভের নামটি আউটপুট দেয় না।
পিএইচপিস্টে

উত্তর:


37

আপনি get_difised_vars () ব্যবহার করতে পারেন কোনও ভেরিয়েবলের নাম সন্ধান নাম সন্ধান করার চেষ্টা করছেন তার সমান মান রয়েছে। স্পষ্টতই এটি সর্বদা কার্যকর হবে না, যেহেতু বিভিন্ন ভেরিয়েবলের প্রায়শই একই মান থাকে তবে আমি এটি করার জন্য এটি ভাবতে পারি way

সম্পাদনা: get_defined_vars () সঠিকভাবে কাজ করছে বলে মনে হচ্ছে না, এটি 'var' ফিরিয়ে দেয় কারণ $ varটি নিজেই ফাংশনে ব্যবহৃত হয়। LO বিশ্বব্যাপী কাজ করছে বলে মনে হচ্ছে তাই আমি এটিকে এটিতে পরিবর্তন করেছি।

function print_var_name($var) {
    foreach($GLOBALS as $var_name => $value) {
        if ($value === $var) {
            return $var_name;
        }
    }

    return false;
}

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


2
আহা। ধীর হয়ে গেছে ;-) একই কথা ভেবেছিল তবে এর পরিবর্তে $ গ্লোবালগুলি ব্যবহার করা হচ্ছে। সুতরাং পরিচয়ের তুলনাটি স্কেলারের মানগুলির সমান ($ a = 'foo'; $ b = 'foo'; জোর দেওয়া ($ a === $ b);)) এর জন্য সত্য?
আরজেলবার্গেল

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

হ্যাঁ, আমি বুঝতে পেরেছি তবে get_difised_vars () যথেষ্ট তা ছিল।
গ্যারি উইলফোবি

2
এমন অনেকগুলি কেস রয়েছে যেখানে এই কোডটি প্রত্যাশার মতো আচরণ করে না।
ট্রয়লসकन

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

49

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

ঝিঁকা দেত্তয়া

<?php

function varName( $v ) {
    $trace = debug_backtrace();
    $vLine = file( __FILE__ );
    $fLine = $vLine[ $trace[0]['line'] - 1 ];
    preg_match( "#\\$(\w+)#", $fLine, $match );
    print_r( $match );
}

$foo = "knight";
$bar = array( 1, 2, 3 );
$baz = 12345;

varName( $foo );
varName( $bar );
varName( $baz );

?>

// Returns
Array
(
    [0] => $foo
    [1] => foo
)
Array
(
    [0] => $bar
    [1] => bar
)
Array
(
    [0] => $baz
    [1] => baz
)

এটি সেই লাইনের উপর ভিত্তি করে কাজ করে যা ফাংশন বলে, এটি যেখানে আপনি যে যুক্তিটি দিয়ে গেছেন তা খুঁজে পায়। আরও ভাল কাজ


2
এটি কাজ করে, তবে কেবলমাত্র যদি ফাংশনটি বর্ণনামটি একই ফাইলটিতে পরিবর্তনশীল হিসাবে পাওয়া যায় তেমন সংজ্ঞায়িত হয়।
rubo77

1
: এখানে আপনি একটি ভালভাবে কার্যকর বিভিন্ন ওভার অন্তর্ভুক্ত করে কাজ করে এটি stackoverflow.com/a/19788805/1069083
rubo77

31

আপনি আপনার পদ্ধতির পরিবর্তন এবং একটি পরিবর্তনশীল ভেরিয়েবল নাম ব্যবহার বিবেচনা করতে পারেন?

$var_name = "FooBar";
$$var_name = "a string";

তাহলে আপনি ঠিক করতে পারেন

print($var_name);

পেতে

FooBar

পরিবর্তনশীল ভেরিয়েবলগুলিতে পিএইচপি ম্যানুয়ালটির লিঙ্কটি এখানে


42
আমি এমন একটি সিস্টেমের সাথে কাজ করেছি যা ভেরিয়েবল ভেরিয়েবলগুলি ব্যাপকভাবে ব্যবহার করে। আমি আপনাকে সতর্ক করতে দিন, এটি সত্যিই দুর্গন্ধযুক্ত সত্যিই দ্রুত পায়!
Icode4food

3
বেশিরভাগ ক্ষেত্রে ব্যবহারকারী কোনও ভেরির নাম এবং মান পেতে চান। "ফাংশন ডিবাগ্বর ($ বর্ণনাম)" ভাবেন এবং তিনি এটিকে "ডিবাগ্বর ('ফু')" বলতে চাইছেন যাতে ডিবাগটি "foo = 123" দেখায়। ভেরিয়েবল ভেরিয়েবলের সাথে তারা পাবেন 'foo' অপরিজ্ঞাত।
জিসিবি

আপনি আসলে কি করছেন তা কেবল দেখুন just ঠিক সেখানে আপনার উদাহরণে আপনি কেবলমাত্র নিজের ম্যানুয়ালটি পড়ুন $FooBarসেই মান সহ একটি পরিবর্তনশীল তৈরি a stringকরুন। এই ভয়ঙ্কর ইমো। আপনি কখনই ভেরিয়েবলকে $FooBarএকটি মান নির্ধারণ করেন না , তবে এটি সেখানে রয়েছে। আউট
তোসকান

20

কেউ মৌলিক কারণে উল্লেখ করেছি বলে মনে হয় কেন এই একটি হয়) কঠিন এবং খ) অপরিণামদর্শী:

  • একটি "ভেরিয়েবল" হ'ল একটি প্রতীক যা অন্য কিছুকে নির্দেশ করে ting পিএইচপি-তে, এটি অভ্যন্তরীণভাবে "জ্যাভাল" নামে পরিচিত এমন কিছু জিনিসের দিকে ইঙ্গিত করে, যা বাস্তবে একই সাথে একাধিক ভেরিয়েবলের জন্য ব্যবহার করা যেতে পারে, হয় তাদের একই মান হওয়ায় (পিএইচপি "" কপি-অন-রাইটিং "নামক কিছু প্রয়োগ $foo = $barকরে যাতে প্রয়োজন হয় না) সরাসরি মেমরি বরাদ্দ করুন) বা কারণ তাদের রেফারেন্স (যেমন $foo =& $bar) দ্বারা বরাদ্দ করা হয়েছে (বা কোনও কার্যক্রমে পাস করা হয়েছে )। সুতরাং একটি জওয়ালের কোনও নাম নেই।
  • যখন আপনি কোনও ফাংশনে একটি প্যারামিটার পাস করেন আপনি একটি নতুন ভেরিয়েবল তৈরি করছেন (এমনকি এটি কোনও রেফারেন্স হলেও)। আপনি বেনামে কিছু পাস করতে পারতেন, যেমন "hello", তবে একবার আপনার ফাংশনের ভিতরে আপনি এটির নাম পরিবর্তন করুন whatever কোড বিভাজনের ক্ষেত্রে এটি মোটামুটি মৌলিক: যদি কোনও ফাংশন নির্ভর করে যা ভেরিয়েবলকে ডাকা হত তার উপর নির্ভর করে , তবে এটি আরও একটির মতো হবেgoto একটি যথাযথ পৃথক ফাংশনের চেয়ে বেশি হবে।
  • গ্লোবাল ভেরিয়েবলগুলি সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয়। এখানে প্রচুর উদাহরণ ধরে নেওয়া হয় যে আপনি যে পরিবর্তনশীলটি "প্রতিবিম্বিত করতে" চান তা পাওয়া যেতে পারে$GLOBALS , তবে এটি তখনই সত্য হবে যদি আপনি আপনার কোডটি খারাপভাবে গঠন করেছেন এবং ভেরিয়েবলগুলি কোনও ফাংশন বা অবজেক্টের জন্য বাদ দেওয়া হয়নি।
  • প্রোগ্রামারদের কোড পড়তে সাহায্য করার জন্য ভেরিয়েবলের নাম রয়েছে। ভেরিয়েবলগুলি আরও ভালভাবে তাদের উদ্দেশ্য অনুসারে পুনর্নবীকরণ করা খুব সাধারণ রিফ্যাক্টরিং অনুশীলন, এবং পুরো বিষয়টি হ'ল এটি কোনও পার্থক্য করে না।

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

আপনার কোডে ডিবাগ ফাংশনটি কোথা থেকে ডেকে আনা হয়েছিল সেই তথ্যটির একটি আরও অনেক বেশি দরকারী অংশ। যেহেতু আপনি আপনার এডিটরটিতে এটি দ্রুত খুঁজে পেতে পারেন, আপনি নিজের জন্য কোন পরিবর্তনশীল আউটপুট তৈরি করতে পারেন তা দেখতে এবং এমনকি একবারে এটি সম্পূর্ণ ভাব প্রকাশ করতে পারে (উদাহরণস্বরূপ debug('$foo + $bar = ' . ($foo + $bar)))।

তার জন্য, আপনি এই স্নিপেটটি আপনার ডিবাগ ফাংশনের শীর্ষে ব্যবহার করতে পারেন:

$backtrace = debug_backtrace();
echo '# Debug function called from ' . $backtrace[0]['file'] . ' at line ' . $backtrace[0]['line'];

ইতিমধ্যে কিছু ভাল উত্তর আছে। সুতরাং এটি বাস্তবতার মুখোমুখি হলেও হতাশাব্যঞ্জক।
a20

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

14

এটি হ'ল আপনি যা চান - এটি একটি "কপিরাইট এবং ড্রপ ইন" ফাংশন যা একটি প্রদত্ত ভেরির নাম প্রতিধ্বনি ব্যবহার করার জন্য প্রস্তুত:

function print_var_name(){
    // read backtrace
    $bt   = debug_backtrace();
    // read file
    $file = file($bt[0]['file']);
    // select exact print_var_name($varname) line
    $src  = $file[$bt[0]['line']-1];
    // search pattern
    $pat = '#(.*)'.__FUNCTION__.' *?\( *?(.*) *?\)(.*)#i';
    // extract $varname from match no 2
    $var  = preg_replace($pat, '$2', $src);
    // print to browser
    echo trim($var);
}

ব্যবহার: মুদ্রণ_ভার_নাম (oo ফুবার)

প্রিন্ট: ফুবার

ইঙ্গিত এখন আপনি ফাংশনটির নাম পরিবর্তন করতে পারেন এবং এটি এখনও কাজ করবে এবং এক লাইনে কয়েকবার ফাংশনটি ব্যবহার করবে! ক্লিফোর্ডলাইফকে ধন্যবাদ


3
শান্ত, এই জন্য ধন্যবাদ। আমি $ প্যাট লাইনটি $pat = '#(.*)'.__FUNCTION__.' *?\( *?(.*) *?\)(.*)#i';এইভাবে সামান্য পরিবর্তিত করেছিলাম এই ডিবাগ ফাংশনটি কী বলা হয় তা নিয়ে আমি পাত্তা দিই না, এবং ফাংশনটিতে যা পাস হয় তা হ'ল $ হ্যালো বা "হ্যালো" পেয়ে যাই (আমি ভেরিয়েবলটি পাস করার জন্য $ ম্যাচটি ফেলে দিয়েছি) ইন, একই লাইনে)
ক্লিফোর্ডলাইফ

1
কোডের চমত্কার টুকরা! ধন্যবাদ! তবে এটি সমস্ত দৃষ্টিতে কাজ করবে বলে মনে হয় না। আমার উবুন্টু 18.04 তে পিএইচপি 7.2.19 এর সাথে পরীক্ষার ফলাফল: একই কোডের একই লাইনে একাধিকবার ব্যবহার করার পরে কাজ করে না, নির্বিশেষে যদি এটি এক বা পৃথক এক্সপ্রেশনে ব্যবহৃত হয় তবে কারণ এটি এর শেষ ভেরিয়েবলের নাম ফেরত দেয় লাইন। যদি এটি একই অভিব্যক্তিতে ব্যবহৃত হয় তবে পৃথক লাইনে এটি কাজ করে। এটি বিভিন্ন লাইনে বিভিন্ন অভিব্যক্তিতে ব্যবহৃত হয়।
ম্যাটি

1
এছাড়াও সেই ফাংশনটি "ভার_ডাম্প" ছাড়াই এক লাইনে থাকা উচিত - সংমিশ্রণ print_var_name, echo, var_dumpপ্রেরণের আউটপুট সহ$variable); echo ' '; var_dump($variable
বিজি ব্রুনো

13

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

function variable_name( &$var, $scope=false, $prefix='UNIQUE', $suffix='VARIABLE' ){
    if($scope) {
        $vals = $scope;
    } else {
        $vals = $GLOBALS;
    }
    $old = $var;
    $var = $new = $prefix.rand().$suffix;
    $vname = FALSE;
    foreach($vals as $key => $val) {
        if($val === $new) $vname = $key;
    }
    $var = $old;
    return $vname;
}

তারপরে চেষ্টা করুন:

$a = 'asdf';
$b = 'asdf';
$c = FALSE;
$d = FALSE;

echo variable_name($a); // a
echo variable_name($b); // b
echo variable_name($c); // c
echo variable_name($d); // d

তার পোস্টটি পিএইচপিএন-তে অবশ্যই দেখে নিন: http://php.net/manual/en/language.variables.php


আপনি অ্যারে আকারে বর্তমান সুযোগ কীভাবে পাবেন?
সেবাস্তিয়ান গ্রিগনোলি

নিস! আমার জন্য কেবল অনুপস্থিত break;যখন ফোরচ সমান পাওয়া যায় + ফাংশনের অভ্যন্তরে সংজ্ঞায়িত হলে আমি স্বয়ংক্রিয়ভাবে var_name পেতে বেসিক কাঠামো ব্যবহারযোগ্য করেছিলাম। যদি আপনি প্রায়শই অনুলিপি করে আটকান বা এটিকে উন্নত করতে আরও ভাল ধারণা পান তবে ব্যবহার করুনvariable_name( $variable, ( empty(__FUNCTION__) ? false : get_defined_vars() ) );
ওডি

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

13

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

এটি কেবল মোড়কের ফাংশন যা উত্তীর্ণ প্রকাশটি সনাক্ত করে। বেশিরভাগ ক্ষেত্রে কাজ করে। আপনি যদি একই লাইনের কোডে ফাংশনটিকে একাধিকবার কল করেন তবে এটি কাজ করবে না।

এটি দুর্দান্ত কাজ করে: মরে ( পরিদর্শন ($ This-> getUser () -> hasCredential ( "মুছে দিন")) );

পরিদর্শন () হ'ল ফাংশন যা উত্তীর্ণ প্রকাশটি সনাক্ত করবে।

আমরা পাই: $ this-> getUser () -> hasCredential ("মুছুন")

function inspect($label, $value = "__undefin_e_d__")
{
    if($value == "__undefin_e_d__") {

        /* The first argument is not the label but the 
           variable to inspect itself, so we need a label.
           Let's try to find out it's name by peeking at 
           the source code. 
        */

        /* The reason for using an exotic string like 
           "__undefin_e_d__" instead of NULL here is that 
           inspected variables can also be NULL and I want 
           to inspect them anyway.
        */

        $value = $label;

        $bt = debug_backtrace();
        $src = file($bt[0]["file"]);
        $line = $src[ $bt[0]['line'] - 1 ];

        // let's match the function call and the last closing bracket
        preg_match( "#inspect\((.+)\)#", $line, $match );

        /* let's count brackets to see how many of them actually belongs 
           to the var name
           Eg:   die(inspect($this->getUser()->hasCredential("delete")));
                  We want:   $this->getUser()->hasCredential("delete")
        */
        $max = strlen($match[1]);
        $varname = "";
        $c = 0;
        for($i = 0; $i < $max; $i++){
            if(     $match[1]{$i} == "(" ) $c++;
            elseif( $match[1]{$i} == ")" ) $c--;
            if($c < 0) break;
            $varname .=  $match[1]{$i};
        }
        $label = $varname;
    }

    // $label now holds the name of the passed variable ($ included)
    // Eg:   inspect($hello) 
    //             => $label = "$hello"
    // or the whole expression evaluated
    // Eg:   inspect($this->getUser()->hasCredential("delete"))
    //             => $label = "$this->getUser()->hasCredential(\"delete\")"

    // now the actual function call to the inspector method, 
    // passing the var name as the label:

      // return dInspect::dump($label, $val);
         // UPDATE: I commented this line because people got confused about 
         // the dInspect class, wich has nothing to do with the issue here.

    echo("The label is: ".$label);
    echo("The value is: ".$value);

}

কর্মক্ষেত্রে পরিদর্শক ফাংশনের (এবং আমার ডিআইস্পেক্ট ক্লাস) উদাহরণ এখানে রয়েছে:

http://inspect.ip1.cc

পাঠ্যগুলি সেই পৃষ্ঠায় স্প্যানিশ ভাষায় রয়েছে তবে কোডটি সংক্ষিপ্ত এবং বুঝতে খুব সহজ।


1
ত্রুটিমুক্ত, এটি কি নুসফায়ার ডিবাগার ইনস্টল করে আপনার উপর নির্ভর করে না?
মাওগ

আমি এই কোডটির একটি সরলিকৃত সংস্করণ সেখানে পোস্ট করেছি। এছাড়াও আমি এই উত্তরটি পরিবর্তন করেছি। এটি এখন প্রতিটি পিএইচপি 5 বাস্তবায়নে চালানো উচিত।
সেবাস্তিয়ান গ্রিগনোলি

এর মতো চতুরতা হ'ল আমি যখনই দেখি লোকেরা "করা যায় না" বা "সম্ভব না" বলে বলে দেখায়, এতে রাসমাস নিজেও এই ক্ষেত্রে অন্তর্ভুক্ত রয়েছে। সেবাস্তিয়ান এবং অন্য যে কেউ এই উত্তরটির জন্য অবদান রেখেছেন ud
নাইট আউল

1
থ্যাঙ্কস নাইট আউল, তবে আমি জোর দিয়ে বলছি যে এটি বুলেট প্রুফ নয় (যেমন উত্তর হিসাবে বলা হয়েছে, যদি আমার "পরিদর্শন ()" ফাংশনটি একবারে একাধিকবার বলা হয় তবে এটি ব্যর্থ হবে!)। আমি কখনও প্রযোজনায় এটি ব্যবহার করব না। এটি কেবলমাত্র কোনও ডিবাগিং ইন্সপেক্টর ফাংশনের জন্য যা কখনও প্রোডাকশন সার্ভারে পৌঁছায় না।
সেবাস্তিয়ান গ্রিগনোলি

7

থেকে Php.net

@ অ্যালেক্সানড্রে - সংক্ষিপ্ত সমাধান

<?php
function vname(&$var, $scope=0)
{
    $old = $var;
    if (($key = array_search($var = 'unique'.rand().'value', !$scope ? $GLOBALS : $scope)) && $var = $old) return $key;  
}
?>

@ লুকাস - ব্যবহার

<?php
//1.  Use of a variable contained in the global scope (default):
  $my_global_variable = "My global string.";
  echo vname($my_global_variable); // Outputs:  my_global_variable

//2.  Use of a local variable:
  function my_local_func()
  {
    $my_local_variable = "My local string.";
    return vname($my_local_variable, get_defined_vars());
  }
  echo my_local_func(); // Outputs: my_local_variable

//3.  Use of an object property:
  class myclass
  {
    public function __constructor()
    {
      $this->my_object_property = "My object property  string.";
    }
  }
  $obj = new myclass;
  echo vname($obj->my_object_property, $obj); // Outputs: my_object_property
?>

4

অনেক জবাব এর কার্যকারিতা নিয়ে প্রশ্ন তোলে। তবে, ভেরিয়েবলের জন্য একটি রেফারেন্স পাওয়া খুব কার্যকর হতে পারে। বিশেষ করে বস্তুর সঙ্গে ক্ষেত্রে এবং এই $ । আমার সমাধান বস্তুগুলির সাথে এবং সম্পত্তি সংজ্ঞায়িত অবজেক্টগুলির সাথেও কাজ করে:

function getReference(&$var)
{
    if(is_object($var))
        $var->___uniqid = uniqid();
    else
        $var = serialize($var);
    $name = getReference_traverse($var,$GLOBALS);
    if(is_object($var))
        unset($var->___uniqid);
    else
        $var = unserialize($var);
    return "\${$name}";    
}

function getReference_traverse(&$var,$arr)
{
    if($name = array_search($var,$arr,true))
        return "{$name}";
    foreach($arr as $key=>$value)
        if(is_object($value))
            if($name = getReference_traverse($var,get_object_vars($value)))
                return "{$key}->{$name}";
}

উপরের উদাহরণ:

class A
{
    public function whatIs()
    {
        echo getReference($this);
    }
}

$B = 12;
$C = 12;
$D = new A;

echo getReference($B)."<br/>"; //$B
echo getReference($C)."<br/>"; //$C
$D->whatIs(); //$D

2

উপরের উত্তরগুলি থেকে অনেকগুলি ভেরিয়েবলের সাথে ভাল পারফরম্যান্সের সাথে অভিযোজিত, অনেকের জন্য মাত্র একটি LO গ্লোবাল স্ক্যান

function compact_assoc(&$v1='__undefined__', &$v2='__undefined__',&$v3='__undefined__',&$v4='__undefined__',&$v5='__undefined__',&$v6='__undefined__',&$v7='__undefined__',&$v8='__undefined__',&$v9='__undefined__',&$v10='__undefined__',&$v11='__undefined__',&$v12='__undefined__',&$v13='__undefined__',&$v14='__undefined__',&$v15='__undefined__',&$v16='__undefined__',&$v17='__undefined__',&$v18='__undefined__',&$v19='__undefined__'
) {
    $defined_vars=get_defined_vars();

    $result=Array();
    $reverse_key=Array();
    $original_value=Array();
    foreach( $defined_vars as $source_key => $source_value){
        if($source_value==='__undefined__') break;
        $original_value[$source_key]=$$source_key;
        $new_test_value="PREFIX".rand()."SUFIX";
        $reverse_key[$new_test_value]=$source_key;
        $$source_key=$new_test_value;

    }
    foreach($GLOBALS as $key => &$value){
        if( is_string($value) && isset($reverse_key[$value])  ) {
            $result[$key]=&$value;
        }
    }
    foreach( $original_value as $source_key => $original_value){
        $$source_key=$original_value;
    }
    return $result;
}


$a = 'A';
$b = 'B';
$c = '999';
$myArray=Array ('id'=>'id123','name'=>'Foo');
print_r(compact_assoc($a,$b,$c,$myArray) );

//print
Array
(
    [a] => A
    [b] => B
    [c] => 999
    [myArray] => Array
        (
            [id] => id123
            [name] => Foo
        )

)

1

যদি ভেরিয়েবলটি আদান-প্রদানযোগ্য হয় তবে আপনার কোথাও যুক্তি থাকতে হবে যা কোন ভেরিয়েবলটি ব্যবহৃত হবে তা নির্ধারণ করে। আপনাকে যা করতে হবে তা হ'ল ভেরিয়েবলের নাম$variable সেই যুক্তির মধ্যে ।

আমি মনে করি আপনি কীসের জন্য এটি প্রয়োজন তা বোঝার জন্য আমরা সকলেই খুব কঠিন সময় কাটাচ্ছি। নমুনা কোড বা আপনি আসলে যা করার চেষ্টা করছেন তার ব্যাখ্যা সাহায্য করতে পারে তবে আমি সন্দেহ করি যে আপনি উপায়, উপায় এটিকে বোঝার উপায় নয়


1

আমি আসলে এই জন্য একটি বৈধ ব্যবহারের কেস আছে।

আমার একটি ফাংশন ক্যাশে ভেরিয়েবল ($ var) রয়েছে (ঠিক আছে, আমার একটি ফাংশন ক্যাশে রয়েছে ($ কী, $ মান) তবে আমি উল্লিখিত হিসাবে একটি ফাংশন রাখতে চাই)।

উদ্দেশ্যটি হ'ল:

$colour = 'blue';
cacheVariable($colour);

...

// another session

...

$myColour = getCachedVariable('colour');

আমি চেষ্টা করেছি

function cacheVariable($variable) {
   $key = ${$variable}; // This doesn't help! It only gives 'variable'.
   // do some caching using suitable backend such as apc, memcache or ramdisk
}

আমিও চেষ্টা করেছি

function varName(&$var) {
   $definedVariables = get_defined_vars();
   $copyOfDefinedVariables = array();
   foreach ($definedVariables as $variable=>$value) {
      $copyOfDefinedVariables[$variable] = $value;
   }
   $oldVar = $var;
   $var = !$var;
   $difference = array_diff_assoc($definedVariables, $copyOfDefinedVariables);
   $var = $oldVar;
   return key(array_slice($difference, 0, 1, true));
}

তবে এটিও ব্যর্থ হয় ... :(

অবশ্যই, আমি ক্যাশে ('রঙ', $ রঙ) চালিয়ে যেতে পারতাম, তবে আমি অলস, আপনি জানেন ...;)

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

আমি এখনও get_func_args () এবং get_func_arg (), $ {} - নির্মাণ এবং কী () মিলিয়ে ব্যবহার করার চেষ্টা করি নি, তবে আমি অনুমান করি যে এটি ব্যর্থও হবে।


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

1

আমার আছে এটা:

  debug_echo(array('$query'=>$query, '$nrUsers'=>$nrUsers, '$hdr'=>$hdr));

আমি এটি পছন্দ করব:

  debug_echo($query, $nrUsers, $hdr);

বিদ্যমান ফাংশনটি একটি লাল আউটলাইন সহ একটি হলুদ বাক্স প্রদর্শন করে এবং নাম এবং মান অনুসারে প্রতিটি পরিবর্তনশীল দেখায়। অ্যারের সমাধানটি কাজ করে তবে এটি যখন প্রয়োজন হয় তখন টাইপ করতে কিছুটা সংশ্লেষিত হয়।

এটি আমার ব্যবহারের ক্ষেত্রে এবং হ্যাঁ, এটির ডিবাগিংয়ের সাথে কোনও সম্পর্ক নেই। যারা অন্যথায় এর ব্যবহার নিয়ে প্রশ্ন করে তাদের সাথে আমি সম্মত।


1

এখানে আমার সমাধান উপর ভিত্তি করে Jeremy Ruten

class DebugHelper {

    function printVarNames($systemDefinedVars, $varNames) {
        foreach ($systemDefinedVars as $var=>$value) {
            if (in_array($var, $varNames )) {
                var_dump($var);
                var_dump($value);
            }
        }
    }
}

এটি ব্যবহার করছি

DebugHelper::printVarNames(
    $systemDefinedVars = get_defined_vars(),
    $varNames=array('yourVar00', 'yourVar01')
);

0

আপনি কেবল একটি সাধারণ ক্রিয়াকলাপটি তৈরি করে তা বলছেন না কেন?

/**
 * Prints out $obj for debug
 *
 * @param any_type $obj
 * @param (string) $title
 */
function print_all( $obj, $title = false )
{
    print "\n<div style=\"font-family:Arial;\">\n";
    if( $title ) print "<div style=\"background-color:red; color:white; font-size:16px; font-weight:bold; margin:0; padding:10px; text-align:center;\">$title</div>\n";
    print "<pre style=\"background-color:yellow; border:2px solid red; color:black; margin:0; padding:10px;\">\n\n";
    var_export( $obj );
    print "\n\n</pre>\n</div>\n";
}

print_all( $aUser, '$aUser' );

0

আমি এটি সন্ধান করছি কিন্তু কেবল নামটি পাস করার সিদ্ধান্ত নিয়েছি, সাধারণত ক্লিপবোর্ডে আমার নাম যাইহোক হয় have

function VarTest($my_var,$my_var_name){
    echo '$'.$my_var_name.': '.$my_var.'<br />';
}

$fruit='apple';
VarTest($fruit,'fruit');

0

এটি অর্জনের জন্য আপনি কমপ্যাক্ট () ব্যবহার করতে পারেন।

$FooBar = "a string";

$newArray = compact('FooBar');

এটি কী হিসাবে ভেরিয়েবলের নাম সহ একটি সহযোগী অ্যারে তৈরি করবে। তারপরে আপনার প্রয়োজনীয় নামটি ব্যবহার করে আপনি অ্যারেটি লুপ করতে পারেন।

foreach($newarray as $key => $value) {
    echo $key;
}

2
দুর্দান্ত তবে এটি ব্যবহারের জন্য আপনাকে ভেরিয়েবলের নাম জানতে হবে। ওপি প্রোগ্রামিয়ালি ভেরিয়েবলের নাম নির্ধারণ করছে।
একটি কোডার

0

আমি মনে করি আপনি এর মান সহ ভেরিয়েবল নামটি জানতে চান। এটি অর্জনের জন্য আপনি একটি সহযোগী অ্যারে ব্যবহার করতে পারেন।

অ্যারে কীগুলির জন্য পরিবর্তনশীল নামগুলি ব্যবহার করুন:

$vars = array('FooBar' => 'a string');

আপনি যখন ভেরিয়েবলের নাম পেতে চান তবে ব্যবহার করুন array_keys($vars), এটি আপনার $varsঅ্যারেতে ব্যবহৃত কীগুলি হিসাবে সেই চলক নামের একটি অ্যারে ফিরিয়ে দেবে ।


ভেরিয়েবল ঘোষণার সাধারণ পদ্ধতির তুলনায় অনেক ধীর।
ডেভিড স্পেক্টর

0

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

বিকল্প 1:

$data = array('$FooBar');  

$vars = [];  
$vars = preg_replace('/^\\$/', '', $data); 

$varname = key(compact($vars));  
echo $varname;

ছাপে:

FOOBAR

যে কোনও কারণে আপনি নিজেকে এই জাতীয় পরিস্থিতিতে দেখতে পাবেন, এটি আসলে কাজ করে।


বিকল্প 2:

$FooBar = "a string";  

$varname = trim(array_search($FooBar, $GLOBALS), " \t.");  
echo $varname;

যদি $FooBarকোনও অনন্য মান থাকে তবে এটি 'ফুবার' মুদ্রণ করবে। যদি$FooBar খালি বা নাল হয় এটি এটি খুঁজে পাওয়া প্রথম খালি বা নাল স্ট্রিংয়ের নাম মুদ্রণ করবে।

এটি যেমন ব্যবহার করা যেতে পারে:

if (isset($FooBar) && !is_null($FooBar) && !empty($FooBar)) {
    $FooBar = "a string";
    $varname = trim(array_search($FooBar, $GLOBALS), " \t.");
}

0

এইভাবেই আমি এটি করেছি

function getVar(&$var) {
    $tmp = $var; // store the variable value
    $var = '_$_%&33xc$%^*7_r4'; // give the variable a new unique value
    $name = array_search($var, $GLOBALS); // search $GLOBALS for that unique value and return the key(variable)
    $var = $tmp; // restore the variable old value
    return $name;
}

ব্যবহার

$city  = "San Francisco";
echo getVar($city); // city

দ্রষ্টব্য: কিছু পিএইচপি 7 সংস্করণ সঠিকভাবে কাজ করবে না এর array_searchসাথে ত্রুটির কারণে $GLOBALS, তবে অন্যান্য সমস্ত সংস্করণ কাজ করবে।

এই https://3v4l.org/UMW7V দেখুন


-1

এই মুহুর্তে ভেরিয়েবলটি পরীক্ষা করতে বিশ্বব্যাপী থেকে ব্যবহারকারী ভেরিয়েবলগুলি বিচ্ছিন্ন করতে এটি ব্যবহার করুন।

function get_user_var_defined () 
{
    return array_slice($GLOBALS,8,count($GLOBALS)-8);     
}

function get_var_name ($var) 
{
    $vuser = get_user_var_defined(); 
    foreach($vuser as $key=>$value) 
    {
        if($var===$value) return $key ; 
    }
}

@ আইএমএসওপি print implode( ' ', array_keys( $GLOBALS ));এটির ফলাফল নির্ধারণ করা "ডিফল্ট" গ্লোবালগুলির সংখ্যা সম্পর্কে একটি ভুল ধারণা বলে মনে হচ্ছে। আমার সিস্টেমে এখানে সাতটি সুপারগ্লোবাল রয়েছে: $ _GET, $ _POST, $ _COOKIE, $ _FILES, $ _ENV, _RE QQUEST, $ _SERVER। এবং এছাড়াও আছে argv এবং argc। সুতরাং অফসেটটি 9 হওয়া উচিত এবং তৃতীয় প্যারামিটার (দৈর্ঘ্য) উল্লেখ করার কোনও অর্থ নেই যেহেতু ডিফল্টটি কেবল অ্যারের শেষের দিকে চালানো যায়।
জেফ

-2

এটি দ্রুত এবং নোংরা হিসাবে বিবেচিত হতে পারে তবে আমার নিজস্ব ব্যক্তিগত পছন্দটি হ'ল এর মতো কোনও ফাংশন / পদ্ধতি ব্যবহার করা:

public function getVarName($var) {      
  $tmp = array($var => '');
  $keys = array_keys($tmp);
  return trim($keys[0]);
}

মূলত এটি কেবল একটি নাল / ফাঁকা উপাদান সমন্বিত একটি মিশ্র অ্যারে তৈরি করে, কী হিসাবে আপনি নামটি চান তার জন্য চলকটি ব্যবহার করে।

তারপরে আমরা অ্যারে_কিগুলি ব্যবহার করে সেই কীটির মান পাই এবং এটি ফিরিয়ে দেব।

স্পষ্টতই এটি অগোছালো হয়ে ওঠে এবং উত্পাদন পরিবেশে এটি কাম্য হবে না, তবে এটি উপস্থাপিত সমস্যার জন্য কাজ করে।


1
ভেরিয়েবলের মান নয়, ভেরিয়েবলের নাম। অন্য কোথাও নির্দেশিত হিসাবে ফাংশন সীমানা জুড়ে নাম বহনযোগ্য নয়।
ওভেন বেরেসফোর্ড

3
বিয়োগ একটি কারণ এই ফাংশনটি আক্ষরিকভাবে ছাঁটা (returning var) ফিরিয়ে দেওয়া ছাড়া কিছুই করে না;
আলেক্সার

-3

চলক নাম পেতে কেন আমাদের গ্লোবাল ব্যবহার করতে হবে ... আমরা নীচের মত সহজভাবে ব্যবহার করতে পারি।

    $variableName = "ajaxmint";

    echo getVarName('$variableName');

    function getVarName($name) {
        return str_replace('$','',$name);
    }

6
কারণ ওপি পরিবর্তনশীল নামটি জানে না। তিনি যদি করেন তবে তার কোনও getVarName()ফাংশনের দরকার পড়বে না । ;-)
FtDRbwLXw6

1
এটি স্ট্রিং হিসাবে কোনও ভেরিয়েবলের নাম দেয় না, কারণ '$variableName'ইতিমধ্যে একটি স্ট্রিং, ভেরিয়েবল নয়। আপনি যদি এই কৌশলটি দিয়ে করতে পারেন তবে আপনি getVarName($variableName);একটি সমালোচনা পাবেন :)
ড্যানিয়েল ডব্লিউ।

-4

আমি সত্যিই ব্যবহারের কেসটি দেখতে ব্যর্থ হই ... আপনি যদি প্রিন্ট_ভার_নাম (oo ফুবার) টাইপ করেন তবে এর পরিবর্তে প্রিন্ট ("ফুবার") টাইপ করার বিষয়ে এত শক্ত (এবং আলাদা) কী আছে?

কারণ আপনি যদি এটি কোনও ফাংশনে ব্যবহার করেন তবে আপনি ভেরিয়েবলের স্থানীয় নামটি পেয়ে যাবেন ...

যাই হোক না কেন, এখানে আপনার কিছু প্রয়োজন পড়ার ক্ষেত্রে প্রতিবিম্ব ম্যানুয়াল এখানে।


মুদ্রণ ("foobar") অন্যান্য ভার্সন পরিচালনা করবে না।
গ্যারি উইলফোবি

7
কেস ব্যবহার করুন: কোডটিতে আপনার একই মানটি ফেলার জন্য কয়েকটি ডিবাগ পয়েন্ট রয়েছে। আপনি কীভাবে জানবেন কোনটি প্রথমে মৃত্যুদন্ড কার্যকর করা হয়েছিল? একটি লেবেল মুদ্রণ তখন খুব দরকারী।
তাকেশিন

তাহলে আপনি পর্যাপ্ত প্রোগ্রামিং করেন নি। বেশিরভাগ ভাষাগুলিতে আমি এসেছি এটি করার কিছু উপায় রয়েছে, সাধারণত সহজ।
b01

@ বি01 আমি প্রচুর কাজ করেছি। আমি পুরোপুরি সচেতন এমন অনেকগুলি ভাষা রয়েছে যা এটির অনুমতি দেয় তবে এটি নিজেই খুব বেশি অর্থ দেয় না। অনেক ভাষায় সহজেই কিছু করার উপায় দেয় এবং এর অর্থ এই নয় যে আপনার যথাযথ প্রবাহ নিয়ন্ত্রণ লেখা এড়াতে এটি ব্যবহার করা উচিত। এটি আমার দৃষ্টিতে অনুরূপ ঘটনা। আমি ন্যায়সঙ্গত মামলা আছে সন্দেহ করি না, এবং সে কারণেই আমি এর জন্য যথাযথ ব্যবহারের ক্ষেত্রে ভাবছিলাম।
ভিঙ্কো ভার্সালোভিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.