স্ট্রিংয়ের উপর ভিত্তি করে আমি কীভাবে কোনও পিএইচপিতে সম্পত্তি পেতে পারি? আমি ফোন করব magic
। তাহলে কী magic
?
$obj->Name = 'something';
$get = $obj->Name;
মত হবে...
magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
স্ট্রিংয়ের উপর ভিত্তি করে আমি কীভাবে কোনও পিএইচপিতে সম্পত্তি পেতে পারি? আমি ফোন করব magic
। তাহলে কী magic
?
$obj->Name = 'something';
$get = $obj->Name;
মত হবে...
magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
উত্তর:
এটার মত
<?php
$prop = 'Name';
echo $obj->$prop;
বা, যদি আপনার ক্লাসের উপর নিয়ন্ত্রণ থাকে তবে অ্যারেএ্যাক্সেস ইন্টারফেসটি প্রয়োগ করুন এবং কেবল এটি করুন
echo $obj['Name'];
ArrayAccess
, Countable
এবং পুনরাবৃত্তকারী ইন্টারফেসগুলির মধ্যে একটি, এটি বেশিরভাগই একটি সাধারণ থেকে পৃথক হতে পারেarray()
যদি আপনি কোনও মধ্যবর্তী পরিবর্তনশীল না তৈরি করে সম্পত্তিটি অ্যাক্সেস করতে চান তবে {}
স্বরলিপিটি ব্যবহার করুন :
$something = $object->{'something'};
এটি আপনাকে উদাহরণস্বরূপ একটি লুপে সম্পত্তিটির নাম তৈরি করতেও সহায়তা করে:
for ($i = 0; $i < 5; $i++) {
$something = $object->{'something' . $i};
// ...
}
$this->{$property}[$name]
, অন্যথায় $this->$property[$name]
একটি ত্রুটি ছুঁড়ে
$this->$property[$name]
সম্ভবত সফল হতে পারে এটি সম্ভবত একটি বাগ হওয়ার সম্ভাবনা রয়েছে। $name
নিঃশব্দে কোনও পূর্ণসংখ্যার কাছে কাস্ট করা হয়। অ-সংখ্যাসূচক স্ট্রিংয়ের ক্ষেত্রে এটি 0
। তারপরে মানটির এই স্ট্রিং সূচকটি$property
সম্পত্তির নাম হিসাবে ব্যবহৃত হয়। যদি $property
"abc" মানটি ধরে রাখে, তবে এটি সম্পত্তি $this->a
(সূচক 0) উল্লেখ করবে । যদি এমন সম্পত্তি থাকে তবে এটি সফল হবে।
আপনি যা সম্পর্কে জিজ্ঞাসা করছেন তাকে ভেরিয়েবল ভেরিয়েবলগুলি বলা হয় । আপনার স্ট্রিংটি ভেরিয়েবলের মধ্যে সঞ্চয় করা এবং এটির মতো অ্যাক্সেস করার জন্য আপনাকে যা করতে হবে তা হল:
$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
এটার মতো কিছু? এটি পরীক্ষা করা হয়নি তবে ভাল কাজ করা উচিত।
function magic($obj, $var, $value = NULL)
{
if($value == NULL)
{
return $obj->$var;
}
else
{
$obj->$var = $value;
}
}
কেবলমাত্র ভেরিয়েবেলে সম্পত্তিটির নাম সংরক্ষণ করুন এবং সম্পত্তিটি অ্যাক্সেস করতে ভেরিয়েবলটি ব্যবহার করুন। এটার মত:
$name = 'Name';
$obj->$name = 'something';
$get = $obj->$name;
এই প্রশ্নের উত্তর থাকতে পারে তবে আপনি এই স্থানান্তরগুলি পিএইচপি 7 এ দেখতে চাইতে পারেন
উত্স: php.net
এটি সহজ, $জেজ -> {$জেজ-> নাম} কোঁকড়া বন্ধনী সম্পত্তিটিকে ভেরিয়েবল ভেরিয়েবলের মতো অনেকটা মুড়ে ফেলবে।
এটি শীর্ষস্থানীয় অনুসন্ধান ছিল। তবে আমার প্রশ্নটি সমাধান করেন নি, যা এটি ব্যবহার করে। আমার পরিস্থিতিগুলির ক্ষেত্রে কোঁকড়ানো বন্ধনী ব্যবহার করাও সহায়তা করেছিল ...
কোড ইগনিটার সহ উদাহরণস্বরূপ পান
উত্সাহিত লাইব্রেরি ক্লাসে অভিভাবক শ্রেণীর উদাহরণ সহ কিছু বলা হয়
$this->someClass='something';
$this->someID=34;
লাইব্রেরি ক্লাসটি অন্য শ্রেণীর থেকে পিতামাতার উদাহরণ সহ উত্সের প্রয়োজন
echo $this->CI->{$this->someClass}->{$this->someID};
কেবল একটি সংযোজন হিসাবে: এইভাবে আপনি এমন নাম সহ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারবেন যা অন্যথায় অব্যর্থ
$ x = নতুন স্টাডক্লাস;$ প্রপ = 'এ বি'; $ x -> $ প্রপ = 1; $ x -> {'x y'} = 2; , var_dump ($ x এর);
অবজেক্ট (stdClass) # 1 (2) ["এ বি"] => int- এ (1) ["x y"] => int- এ (2) }(আপনার উচিত এমনটি নয়, তবে আপনাকে যা করতে হবে)।
অন্য কেউ যদি অজানা গভীরতার গভীর সম্পত্তি খুঁজে পেতে চান তবে আমি সমস্ত বাচ্চার পরিচিত সমস্ত বৈশিষ্ট্য লুপ করার প্রয়োজন ছাড়াই নীচে নিয়ে এসেছি।
উদাহরণস্বরূপ, $ ফু-> বার-> বাজ, বা $ ফু-> বাজ, বা $ ফু-> বার-> বাজ-> ডেভ সন্ধান করতে যেখানে $ পথটি 'ফু / বার / বাজ' এর মতো স্ট্রিং।
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);
আমার চেষ্টা এখানে। এটিতে কিছু সাধারণ 'বোকামি' চেকগুলি অন্তর্নির্মিত রয়েছে, এটি নিশ্চিত করে যে আপনি কোনও সদস্যকে সেট করার বা পাওয়া যাবেন না যা উপলব্ধ নেই।
আপনি সেই 'সম্পত্তি_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";
?>
এই ফাংশনটি যা করে তা হ'ল তার সন্তানের যে কোনও শ্রেণির এই সম্পত্তিটিতে সম্পত্তি রয়েছে কিনা তা যাচাই করে এবং যদি এটির মূল্য পায় অন্যথায় এটি বাতিল হয়। সুতরাং এখন বৈশিষ্ট্যগুলি 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);
$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 এই ভাষায় পুরানো হচ্ছে।