wake-up-neo.com

Anonyme Objekte in PHP erstellen

Wie Sie wissen, ist das Erstellen anonymer Objekte in JavaScript sehr einfach, wie im folgenden Code:

var object = { 
    p : "value", 
    p1 : [ "john", "johnny" ] } ; 
alert(object.p1[1]) ;

Ausgabe:

an alert is raised with value "johnny"

Kann diese Technik auch bei PHP angewendet werden? Können wir anonyme Objekte in PHP erstellen?

120
Sujit Agarwal

Es ist schon einige Jahre her, aber ich denke, ich muss die Informationen auf dem neuesten Stand halten!


In PHP-7 ist es möglich, anonyme Klassen zu erstellen, sodass Sie Folgendes tun können:

<?php

    class Foo {}
    $child = new class extends Foo {};

    var_dump($child instanceof Foo); // true

?>

Weitere Informationen hierzu finden Sie im RFC (wird akzeptiert): https://wiki.php.net/rfc/anonymous_classes

Aber ich weiß nicht, wie ähnlich es zu Javscript ist, daher kann es einige Unterschiede zwischen anonymen Klassen in Javascript und PHP geben.

Bearbeiten:

Wie aus den geposteten Kommentaren hier nun der Link zum Handbuch: http://php.net/manual/de/language.oop5.anonymous.php

31
Rizier123

"Anonym" ist nicht die richtige Terminologie, wenn über Objekte gesprochen wird. Es wäre besser, "object of anonymous type" zu sagen, dies gilt jedoch nicht für PHP.

Alle Objekte in PHP haben eine Klasse. Die "default" -Klasse ist stdClass , und Sie können Objekte davon auf folgende Weise erstellen:

$obj = new stdClass;
$obj->aProperty = 'value';

Sie können auch ein Array in ein Objekt umwandeln für eine bequemere Syntax nutzen:

$obj = (object)array('aProperty' => 'value');
print_r($obj);

Beachten Sie jedoch, dass das Casting eines Arrays in ein Objekt wahrscheinlich "interessante" Ergebnisse für die Array-Schlüssel ergibt, die nicht gültige PHP -Variablennamen sind - zum Beispiel hier ist eine Antwort von mir, die dies zeigt Was passiert, wenn Schlüssel mit Ziffern beginnen.

214
Jon

Ja, es ist möglich! Verwendung dieses einfachen PHP Anonymous-Objekts Klasse. Wie es funktioniert:

// define by passing in constructor
$anonim_obj = new AnObj(array(
    "foo" => function() { echo "foo"; }, 
    "bar" => function($bar) { echo $bar; } 
));

$anonim_obj->foo(); // prints "foo"
$anonim_obj->bar("hello, world"); // prints "hello, world"

// define at runtime
$anonim_obj->Zoo = function() { echo "Zoo"; };
$anonim_obj->Zoo(); // prints "Zoo"

// mimic self 
$anonim_obj->prop = "abc";
$anonim_obj->propMethod = function() use($anonim_obj) {
    echo $anonim_obj->prop; 
};
$anonim_obj->propMethod(); // prints "abc"

Natürlich ist dieses Objekt eine Instanz der AnObj-Klasse, daher ist es nicht wirklich anonym, aber es ermöglicht die schnelle Definition von Methoden, wie dies bei JavaScript der Fall ist.

19
Mihailoff

Bis vor kurzem habe ich so schnell Objekte erstellt.

$someObj = json_decode("{}");

Dann:

$someObj->someProperty = someValue;

Aber jetzt gehe ich mit:

$someObj = (object)[];

Dann wie vorher:

$someObj->someProperty = someValue;

Wenn Sie die Eigenschaften und Werte bereits kennen, können Sie sie natürlich wie angegeben einstellen:

$someObj = (object)['prop1' => 'value1','prop2' => 'value2'];

NB: Ich weiß nicht, welche Versionen von PHP dies funktioniert, daher müssten Sie sich dessen bewusst sein. Ich denke jedoch, dass der erste Ansatz (der auch kurz ist, wenn beim Bau keine Eigenschaften festgelegt werden müssen) für alle Versionen funktionieren sollte, die json_encode/json_decode haben

13
Zuks

Wenn Sie JavaScript nachahmen möchten, können Sie eine Klasse Object erstellen und somit das gleiche Verhalten erhalten. Das ist natürlich nicht mehr anonym, aber es wird funktionieren.

<?php 
class Object { 
    function __construct( ) { 
        $n = func_num_args( ) ; 
        for ( $i = 0 ; $i < $n ; $i += 2 ) { 
            $this->{func_get_arg($i)} = func_get_arg($i + 1) ; 
        } 
    } 
} 

$o = new Object( 
    'aProperty', 'value', 
    'anotherProperty', array('element 1', 'element 2')) ; 
echo $o->anotherProperty[1];
?>

Das wird Element 2 ausgeben. Dies wurde aus einem Kommentar zu PHP gestohlen: Klassen und Objekte .

7
kba

Stenografie:

$obj = (object)      ['property' => 'Here we go'];
                 //or//
$obj = (object) array('property' => 'Here we go');
5
T.Todua

Wenn Sie ein Objekt (wie in Javascript) mit dynamischen Eigenschaften erstellen möchten, ohne eine Warnung über eine undefinierte Eigenschaft zu erhalten, wenn Sie keinen Wert auf property gesetzt haben 

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null
0
fredtma

Für jemanden, der ein rekursives Objekt möchte:

$o = (object) array(
    'foo' => (object) array(
        'sub' => '...'
    )
);

echo $o->foo->sub;
0
Jonatas Walker

Kann diese Technik auch bei PHP angewendet werden?

Nein, da Javascript Prototypen/direkte Deklaration von Objekten verwendet - in PHP (und vielen anderen OO Sprachen), kann ein Objekt nur aus einer Klasse erstellt werden.

Die Frage lautet also: Können Sie eine anonyme Klasse erstellen?.

Wiederum ist die Antwort nein - wie würden Sie die Klasse instanziieren, ohne sie referenzieren zu können?

0
symcbean