স্ট্রিং করে পিএইচপি শ্রেণীর সম্পত্তি পান


139

স্ট্রিংয়ের উপর ভিত্তি করে আমি কীভাবে কোনও পিএইচপিতে সম্পত্তি পেতে পারি? আমি ফোন করব magic। তাহলে কী magic?

$obj->Name = 'something';
$get = $obj->Name;

মত হবে...

magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');

উত্তর:


241

এটার মত

<?php

$prop = 'Name';

echo $obj->$prop;

বা, যদি আপনার ক্লাসের উপর নিয়ন্ত্রণ থাকে তবে অ্যারেএ্যাক্সেস ইন্টারফেসটি প্রয়োগ করুন এবং কেবল এটি করুন

echo $obj['Name'];

প্রথম বিকল্প দ্বিতীয় ব্যবহার করে কোন লাভ?
ক্লোজ

2
@ ক্লক্স সাধারণতঃ যদি আপনার যদি এমন কোনও সিস্টেম থাকে যা অ্যারে-জাতীয় উপায়ে একটি চলক গ্রহণ করে তবে আপনি যদি নমনীয়তা এবং বস্তুগুলির দ্বারা প্রদত্ত শক্তি চান তবে পরবর্তীটি ব্যবহার করার প্রধান সুবিধা। যদি কোনও শ্রেণি প্রয়োগ করে ArrayAccess, Countableএবং পুনরাবৃত্তকারী ইন্টারফেসগুলির মধ্যে একটি, এটি বেশিরভাগই একটি সাধারণ থেকে পৃথক হতে পারেarray()
পিটার বেইলি

158

যদি আপনি কোনও মধ্যবর্তী পরিবর্তনশীল না তৈরি করে সম্পত্তিটি অ্যাক্সেস করতে চান তবে {}স্বরলিপিটি ব্যবহার করুন :

$something = $object->{'something'};

এটি আপনাকে উদাহরণস্বরূপ একটি লুপে সম্পত্তিটির নাম তৈরি করতেও সহায়তা করে:

for ($i = 0; $i < 5; $i++) {
    $something = $object->{'something' . $i};
    // ...
}

8
আপনি যদি একটি অ্যারে মান অ্যাক্সেস করতে চান তবে এটি একমাত্র উপায় $this->{$property}[$name], অন্যথায় $this->$property[$name]একটি ত্রুটি ছুঁড়ে
ফেলবে

@ গোয়েট: এটি মান এবং পিএইচপি সংস্করণ নির্ভর করে। 5.3 এ এটি একটি E_NOTICE কে ট্রিগার করে কারণ সম্পত্তিটি "ত্রুটি" না করে পাওয়া যায় না, কারণ এটি এখনও বৈধ পিএইচপি সিনট্যাক্স। এটি $this->$property[$name]সম্ভবত সফল হতে পারে এটি সম্ভবত একটি বাগ হওয়ার সম্ভাবনা রয়েছে। $nameনিঃশব্দে কোনও পূর্ণসংখ্যার কাছে কাস্ট করা হয়। অ-সংখ্যাসূচক স্ট্রিংয়ের ক্ষেত্রে এটি 0। তারপরে মানটির এই স্ট্রিং সূচকটি$property সম্পত্তির নাম হিসাবে ব্যবহৃত হয়। যদি $property"abc" মানটি ধরে রাখে, তবে এটি সম্পত্তি $this->a(সূচক 0) উল্লেখ করবে । যদি এমন সম্পত্তি থাকে তবে এটি সফল হবে।
মিঃউইট

@ গোয়েট: তবে, পিএইচপি 5.4-তে, একটি অ-সংখ্যাযুক্ত স্ট্রিং সূচকটি নিঃশব্দে পূর্ণসংখ্য 0 তে কাস্ট করা হয়নি, এটি একটি E_WARNING ট্রিগার করবে।
মিঃহাইট

13

আপনি যা সম্পর্কে জিজ্ঞাসা করছেন তাকে ভেরিয়েবল ভেরিয়েবলগুলি বলা হয় । আপনার স্ট্রিংটি ভেরিয়েবলের মধ্যে সঞ্চয় করা এবং এটির মতো অ্যাক্সেস করার জন্য আপনাকে যা করতে হবে তা হল:

$Class = 'MyCustomClass';
$Property = 'Name';
$List = array('Name');

$Object = new $Class();

// All of these will echo the same property
echo $Object->$Property;  // Evaluates to $Object->Name
echo $Object->{$List[0]}; // Use if your variable is in an array

3
পরিবর্তনশীল ভেরিয়েবলগুলি অন্য জিনিস।
ইলফুর ওয়েজ

2
নামটি যখন স্ট্রিংয়ে (ভেরিয়েবল) থাকে তখন শ্রেণি সম্পত্তি (পরিবর্তনশীল) কীভাবে পাবেন তা প্রশ্ন। নাকি আমি প্রশ্নটি ভুলভাবে লিখেছি?
matpie

8

এটার মতো কিছু? এটি পরীক্ষা করা হয়নি তবে ভাল কাজ করা উচিত।

function magic($obj, $var, $value = NULL)
{
    if($value == NULL)
    {
        return $obj->$var;
    }
    else
    {
        $obj->$var = $value;
    }
}

2
+1, স্ট্রিং ব্যবহার করে অবজেক্টের বৈশিষ্ট্য অ্যাক্সেস করা যেতে পারে তা জানতেন না।
মার্কো ডেমাইও

5

কেবলমাত্র ভেরিয়েবেলে সম্পত্তিটির নাম সংরক্ষণ করুন এবং সম্পত্তিটি অ্যাক্সেস করতে ভেরিয়েবলটি ব্যবহার করুন। এটার মত:

$name = 'Name';

$obj->$name = 'something';
$get = $obj->$name;


4

এটি সহজ, $জেজ -> {$জেজ-> নাম} কোঁকড়া বন্ধনী সম্পত্তিটিকে ভেরিয়েবল ভেরিয়েবলের মতো অনেকটা মুড়ে ফেলবে।

এটি শীর্ষস্থানীয় অনুসন্ধান ছিল। তবে আমার প্রশ্নটি সমাধান করেন নি, যা এটি ব্যবহার করে। আমার পরিস্থিতিগুলির ক্ষেত্রে কোঁকড়ানো বন্ধনী ব্যবহার করাও সহায়তা করেছিল ...

কোড ইগনিটার সহ উদাহরণস্বরূপ পান

উত্সাহিত লাইব্রেরি ক্লাসে অভিভাবক শ্রেণীর উদাহরণ সহ কিছু বলা হয়

$this->someClass='something';
$this->someID=34;

লাইব্রেরি ক্লাসটি অন্য শ্রেণীর থেকে পিতামাতার উদাহরণ সহ উত্সের প্রয়োজন

echo $this->CI->{$this->someClass}->{$this->someID};

2

কেবল একটি সংযোজন হিসাবে: এইভাবে আপনি এমন নাম সহ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারবেন যা অন্যথায় অব্যর্থ

$ x = নতুন স্টাডক্লাস;

$ প্রপ = 'এ বি'; $ x -> $ প্রপ = 1; $ x -> {'x y'} = 2; , var_dump ($ x এর);

অবজেক্ট (stdClass) # 1 (2)
  ["এ বি"] =>
  int- এ (1)
  ["x y"] =>
  int- এ (2)
}
(আপনার উচিত এমনটি নয়, তবে আপনাকে যা করতে হবে)।
যদি আপনি এমনকি ফ্যানসিয়ার স্টাফগুলি করতে চান তবে আপনার প্রতিবিম্বটি দেখতে হবে


1

অন্য কেউ যদি অজানা গভীরতার গভীর সম্পত্তি খুঁজে পেতে চান তবে আমি সমস্ত বাচ্চার পরিচিত সমস্ত বৈশিষ্ট্য লুপ করার প্রয়োজন ছাড়াই নীচে নিয়ে এসেছি।

উদাহরণস্বরূপ, $ ফু-> বার-> বাজ, বা $ ফু-> বাজ, বা $ ফু-> বার-> বাজ-> ডেভ সন্ধান করতে যেখানে $ পথটি 'ফু / বার / বাজ' এর মতো স্ট্রিং।

public function callModule($pathString, $delimiter = '/'){

    //split the string into an array
    $pathArray = explode($delimiter, $pathString);

    //get the first and last of the array
    $module = array_shift($pathArray);
    $property = array_pop($pathArray);

    //if the array is now empty, we can access simply without a loop
    if(count($pathArray) == 0){
        return $this->{$module}->{$property};
    }

    //we need to go deeper
    //$tmp = $this->Foo
    $tmp = $this->{$module};

    foreach($pathArray as $deeper){
        //re-assign $tmp to be the next level of the object
        // $tmp = $Foo->Bar --- then $tmp = $Bar->baz
        $tmp = $tmp->{$deeper};
    }

    //now we are at the level we need to be and can access the property
    return $tmp->{$property};

}

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

$propertyString = getXMLAttribute('string'); // '@Foo/Bar/baz'
$propertyString = substr($propertyString, 1);
$moduleCaller = new ModuleCaller();
echo $moduleCaller->callModule($propertyString);

0

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

আপনি সেই 'সম্পত্তি_exists' চেকগুলি যথাক্রমে __set এবং __get এ সরিয়ে নিতে পারেন এবং তাদের সরাসরি যাদুতে কল করতে পারেন ()।

<?php

class Foo {
    public $Name;

    public function magic($member, $value = NULL) {
        if ($value != NULL) {
            if (!property_exists($this, $member)) {
                trigger_error('Undefined property via magic(): ' .
                    $member, E_USER_ERROR);
                return NULL;
            }
            $this->$member = $value;
        } else {
            if (!property_exists($this, $member)) {
                trigger_error('Undefined property via magic(): ' .
                    $member, E_USER_ERROR);
                return NULL;
            }
            return $this->$member;
        }
    }
};

$f = new Foo();

$f->magic("Name", "Something");
echo $f->magic("Name") , "\n";

// error
$f->magic("Fame", "Something");
echo $f->magic("Fame") , "\n";

?>

0

এই ফাংশনটি যা করে তা হ'ল তার সন্তানের যে কোনও শ্রেণির এই সম্পত্তিটিতে সম্পত্তি রয়েছে কিনা তা যাচাই করে এবং যদি এটির মূল্য পায় অন্যথায় এটি বাতিল হয়। সুতরাং এখন বৈশিষ্ট্যগুলি alচ্ছিক এবং গতিশীল।

/**
 * check if property is defined on this class or any of it's childes and return it
 *
 * @param $property
 *
 * @return bool
 */
private function getIfExist($property)
{
    $value = null;
    $propertiesArray = get_object_vars($this);

    if(array_has($propertiesArray, $property)){
        $value = $propertiesArray[$property];
    }

    return $value;
}

ব্যবহার:

const CONFIG_FILE_PATH_PROPERTY = 'configFilePath';

$configFilePath = $this->getIfExist(self::CONFIG_FILE_PATH_PROPERTY);

-6
$classname = "myclass";
$obj = new $classname($params);

$variable_name = "my_member_variable";
$val = $obj->$variable_name; //do care about the level(private,public,protected)

$func_name = "myFunction";
$val = $obj->$func_name($parameters);

কেন সম্পাদনা করুন: পূর্বে: alভাল (খারাপ) ব্যবহার করার পরে: কোনও ফলই নয় al এই ভাষায় পুরানো হচ্ছে।


এটি খুব খারাপ পরামর্শ, এভাল () ফাংশনটি একটি অত্যন্ত বিপজ্জনক সরঞ্জাম এবং আপনাকে ইঞ্জেকশন আক্রমণে বিপজ্জনকভাবে ফেলে রাখবে। blog.highub.com/php/php-core/php-eval-is-evil আপনাকে কিছু তথ্য দেওয়া উচিত।
উপহাস 2

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