سؤال

كيف يمكنني الحصول على خاصية في PHP بناءً على سلسلة؟سأتصل به magic.إذا ماذا magic?

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

سيكون مثل...

magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
هل كانت مفيدة؟

المحلول

ومثل هذا

<?php

$prop = 'Name';

echo $obj->$prop;

وأو، إذا كان لديك السيطرة على الطبقة، وتنفيذ ArrayAccess واجهة ومجرد القيام بهذا

echo $obj['Name'];

نصائح أخرى

إذا كنت ترغب في الوصول إلى الخاصية دون إنشاء متغير متوسطة، استخدم تدوين {}:

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

وهذا أيضا يسمح لك لبناء اسم الخاصية في حلقة على سبيل المثال:

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

وماذا كنت طالبا حول ما يسمى المتغيرات متغير . كل ما عليك القيام به هو تخزين سلسلة الخاص بك في متغير والوصول إليه مثل ذلك:

$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;

وانها بسيطة، $ الكائنات -> {$ obj-> اسم} الأقواس المعقوفة سوف التفاف الكثير من الممتلكات مثل متغير متغير

وكان هذا البحث العلوي. ولكن لم يتم حل سؤالي، الذي كان يستخدم $ هذا. في حالة الظرف الخاص بي باستخدام قوس مجعد ساعد أيضا ...

والمثال مع رمز مشعل على سبيل المثال

وفي فئة مكتبة مصادر دعا شيء مع مثيل الفئة الأصل

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

والطبقة مكتبة الحاجة إلى مصدر من فئة أخرى أيضا مع المثال الآباء

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

قد تكون هناك إجابات لهذا السؤال، ولكن قد ترغب في رؤية عمليات الترحيل هذه إلى PHP 7

backward incompatible change

مصدر: php.net

وفقط كإضافة: وبهذه الطريقة يمكنك الوصول إلى الخصائص ذات الأسماء التي ستكون غير صالحة للاستعمال غير ذلك

$x = new StdClass;

$prop = 'a b'; $x->$prop = 1; $x->{'x y'} = 2; var_dump($x);

object(stdClass)#1 (2) {
  ["a b"]=>
  int(1)
  ["x y"]=>
  int(2)
}
(وليس التي يجب، ولكن في حال كان لديك ل).
إذا كنت تريد أن تفعل حتى مربي الحيوانات الاشياء يجب أن ننظر إلى انعكاس

في حال أي شخص آخر يريد أن يجد خاصية عميقة عمق غير معروف، خطرت لي أدناه دون الحاجة إلى حلقة من خلال جميع الخصائص المعروفة لجميع الأطفال.

وعلى سبيل المثال، لإيجاد $ Foo-> Bar-> الباز، أو $ Foo-> الباز، أو $ Foo-> Bar-> Baz-> ديف، حيث $ مسار عبارة عن سلسلة مثل "فو / شريط / الباز .

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);

وهنا هو محاولة مني. لديه بعض الاختبارات العادية "الغباء" التي بنيت في، والتأكد من أنك لا محاولة تعيين أو الحصول على الأعضاء التي ليست متوفرة.

هل يمكن نقل الشيكات تلك 'property_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";

?>

وهذا ما يفعله هو وظيفة فإنه يتحقق إذا كانت الخاصية موجودة على هذه الفئة من أي من ولده، ووإذا كان الأمر كذلك فإنه يحصل على قيمة وإلا فإنها ترجع فارغة. وحتى الآن خصائص اختيارية والحيوية.

/**
 * 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);

وماذا تحرير: قبل: استخدام وحدة التقييم (الشر) بعد: لا وحدة التقييم على الإطلاق. كونها قديمة في هذه اللغة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top