• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Objekt als Parameter

freakXHTML

Mitglied
Hallo zusammen,
wie kann ich denn in PHP ein Objekt der Klasse mysqli einer Funktion als Parameter übergeben, sodass ich in der Funktion damit arbeiten kann? In C++ würde ich einfach einen Zeiger übergeben, doch hier?

Könnt ihr mir helfen, denn auch Google weiß nicht allzu viel.

Vielen Dank
lg, freakXHTML
 
Werbung:
PHP:
function processResult (MySQLi_Result $result) {
    /* irgendwas mit $result machen */
}
$result muss hier eine Instanz von MySQLi_Result sein. Objekte werden immer als Referenz übergeben.
 
Werbung:
Objekte werden immer als Referenz übergeben.

Die Unterscheidung ist selten von praktischer Relevanz (und vielleicht auch teilweise semantisch), aber: Objekte werden wie Primitive (int, string, ...) normalerweise "by value" übergeben.

Einfacher Test:

PHP:
<?php

class Foo {}

function f($obj) { $obj = null; }

$o = new Foo();
f($o);
var_dump($o); // $o ist nicht null

Post-Recycling:

Auch die Übergabe von Objekten verhält sich übrigens streng nach "call by value" und "call by reference".

PHP:
class A { public $foo = '';
          public function __toString() { return 'A: ' . $this->foo; } }

class B { public function __toString() { return 'B'; } }

// call by value
function test1($obj) { $obj->foo = 'test1';
                       $obj      = new B(); }

// call by reference
function test2(&$obj) { $obj->foo = 'test2';
                        $obj      = new B(); }

$a  = new A();
$a2 = $a;

test1($a);
echo '$a  - ' . $a , '<br>';
echo '$a2 - ' . $a2, '<br>';

echo '<hr>';

test2($a);
echo '$a  - ' . $a , '<br>';
echo '$a2 - ' . $a2, '<br>';

Code:
$a  - A: test1
$a2 - A: test1
------------------------------------
$a  - B
$a2 - A: test2

Ein "Objekt" in PHP ist eine Variable, die als Wert einen "object identifier" enthält. Dieser object identifier ist es, über den PHP auf die eigentlichen Daten des Objekts zugreift.

In test1() wird der object identifier von $a nach $obj kopiert. Bei der Neuzuweisung einer Instanz von B an $obj wird dann lediglich der Wert (der object identifier) der Kopie überschrieben, der Wert in $a bleibt unberührt.

In test2() wird &$obj als Referenz auf $a initialisiert. Der object identifier wird nicht kopiert, $obj ist nun vielmehr ein Alias, das auf denselben Wert zeigt wie $a. Deshalb wird hier beim Überschreiben von $obj mit einer Instanz von B (also einem neuen object identifier) auch der object identifier in $a entsprechend geändert.

In beiden Fällen bleibt der Wert (also der object identifier) in $a2 unbeeinflusst, da $a2 eine echte Kopie des object identifiers enthält, mit dem $a initialisiert wurde.
 
Zurück
Oben