Frage

Wie wir wissen, ist das Erstellen anonymer Objekte in JavaScript 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 dieselbe Technik im Fall von PHP angewendet werden?Können wir in PHP anonyme Objekte erstellen?

War es hilfreich?

Lösung

Es ist 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 folgende Aktionen ausführen können:

<?php

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

    var_dump($child instanceof Foo); // true

?>

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

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

Bearbeiten:

Wie aus den Kommentaren hervorgeht, ist hier der Link zum Handbuch jetzt: http:// php.net / manual / de / language.oop5.anonymous.php

Andere Tipps

"Anonymous" ist nicht die richtige Terminologie, wenn Sie über Objekte sprechen. Es wäre besser, "Objekt von Anonymous type " zu sagen, aber dies gilt nicht für PHP.

Alle Objekte in PHP verfügen über eine Klasse. Die "Standard-Klasse" ist stdClass , und Sie können Objekte auf diese Weise erstellen : generasacodicetagpre.

Sie können auch von nutzen Gießen Sie ein Array an ein Objekt für eine komfortablere Syntax: generasacodicetagpre.

beraten, dass das Gießen eines Arrays an ein Objekt wahrscheinlich "interessante" Ergebnisse für diese Array-Tasten ergeben wird, die keine gültigen PHP-Variablennamen sind - beispielsweise Hier ist eine Antwort von mir, die zeigt, was passiert, wenn Tasten mit Ziffern beginnen. .

Ja, es ist möglich!Mit dieser einfachen Anonymes PHP-Objekt 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 von AnObj Klasse, daher ist sie nicht wirklich anonym, ermöglicht aber das schnelle Definieren von Methoden, wie dies bei JavaScript der Fall ist.

Bis vor kurzem habe ich auf diese Weise Objekte im laufenden Betrieb erstellt.

$someObj = json_decode("{}");

Dann:

$someObj->someProperty = someValue;

Aber jetzt gehe ich mit:

$someObj = (object)[];

Dann wie zuvor:

$someObj->someProperty = someValue;

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

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

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

Wenn Sie JavaScript imitieren möchten, können Sie eine Klasse Object erstellen und erhalten so das gleiche Verhalten.Natürlich ist dies nicht mehr ganz 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];
?>

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

Konvertiert Array in Objekt:
$obj = (object)  ['myProp' => 'myVal'];

Wenn Sie ein Objekt (wie in Javascript) mit dynamischen Eigenschaften erstellen möchten, ohne eine Warnung vor undefinierten Eigenschaften zu erhalten, wenn Sie keinen Wert auf Eigenschaft festgelegt 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

Kann dieselbe Technik bei PHP angewendet werden?

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

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

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

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

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

echo $o->foo->sub;

Aus der PHP-Dokumentation einige weitere Beispiele:

<?php

$obj1 = new \stdClass; // Instantiate stdClass object
$obj2 = new class{}; // Instantiate anonymous class
$obj3 = (object)[]; // Cast empty array to object

var_dump($obj1); // object(stdClass)#1 (0) {}
var_dump($obj2); // object(class@anonymous)#2 (0) {}
var_dump($obj3); // object(stdClass)#3 (0) {}

?>

$ obj1 und $ obj3 sind vom gleichen Typ, aber $ obj1!== $ obj3.Außerdem werden alle drei json_encode () zu einem einfachen JS-Objekt {}:

<?php

echo json_encode([
    new \stdClass,
    new class{},
    (object)[],
]);

?>

Ausgaben:

[{},{},{}]

https://www.php.net/manual/en/language.types.object.php

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