Frage

Wie erhalte ich eine Immobilie in einer PHP auf einer Zeichenfolge basiert? Ich nenne es magic. Also, was ist magic?

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

wäre wie ...

magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
War es hilfreich?

Lösung

Wie diese

<?php

$prop = 'Name';

echo $obj->$prop;

Oder, wenn Sie die Kontrolle über die Klasse haben, implementieren die Arrayaccess Schnittstelle und dies nur tun

echo $obj['Name'];

Andere Tipps

Wenn Sie die Eigenschaft zugreifen möchten, ohne eine Zwischenvariable zu erstellen, verwenden Sie die {} Notation:

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

Das können Sie auch den Namen der Eigenschaft in einer Schleife zum Beispiel erstellen:

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

Was Sie fragen über nennt Variable Variablen . Alles, was Sie Ihre Zeichenfolge tun müssen, in einer Variablen speichern und darauf zugreifen wie folgt:

$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

So etwas wie das? Habe es nicht getestet, sollte aber funktionieren.

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

Speichern Sie einfach den Namen der Eigenschaft in einer Variablen, und verwenden Sie die Variable auf die Eigenschaft zuzugreifen. Wie folgt aus:

$name = 'Name';

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

Es ist einfach, $ obj. -> {$ obj-> Name} die geschweiften Klammern wird die Eigenschaft viel wie eine Variable Variable wickeln

Das war eine Top-Suche. Aber habe meine Frage nicht lösen, die diesen $ benutzen. Im Fall meines Umstandes der geschweifte Klammer auch mit dazu beigetragen, ...

Beispiel mit Code Igniter bekommen Instanz

in einer sourced Bibliotheksklasse etwas mit einer übergeordneten Klasse-Instanz namens

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

die Bibliothek-Klasse Quelle von einer anderen Klasse, um auch mit den Eltern Instanz

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

Es könnte Antworten geben auf diese Frage, aber Sie können diese Migrationen auf PHP 7

sehen wollen

rückwärts inkompatible Änderung

Quelle: php.net

Nur als Ergänzung: Auf diese Weise können Eigenschaften mit Namen zugreifen können, die ansonsten unbrauchbar sein würde

$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)
}
(nicht, dass Sie sollten, aber falls Sie müssen).
Wenn Sie möchten, auch ausgefallenere Sachen tun, sollten Sie suchen in Reflexion

Falls jemand will eine tiefe Eigenschaft unbekannter Tiefe finden, kam ich auf die unten nach oben, ohne durch alle bekannten Eigenschaften aller Kinder in einer Schleife zu benötigen.

Zum Beispiel finden $ foo-> Bar-> baz oder $ foo-> baz oder $ foo-> Bar-> Baz-> dave, wobei $ Pfad eine Zeichenkette wie ‚foo / bar / baz ist ‘.

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

}

Und dann rufen Sie mit so etwas wie:

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

Hier ist mein Versuch. Es hat einige gemeinsame Kontrollen ‚Dummheit‘ eingebaut, dafür, dass Sie nicht versuchen, zu setzen oder ein Mitglied zu erhalten, die nicht verfügbar ist.

Sie könnten diese 'property_exists Checks bewegen bzw. __set und __get und nennen sie direkt innerhalb Magie ().

<?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";

?>

Was diese Funktion tut, ist es überprüft, ob die Eigenschaft auf diese Klasse von keinem seiner Kindes vorhanden sind, und wenn ja, wird der Wert bekommt sonst gibt es null. So, jetzt die Eigenschaften sind optional und dynamisch.

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

Verbrauch:

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

warum bearbeiten: vor: mit eval (Übel) nach: überhaupt keine eval. Sein alt in dieser Sprache.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top