php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Variable Variablen funktionieren in PHP 7 nicht mehr wie in PHP 5


 
UlfDunkel
23-08-2016, 18:08 
 
Liebe Leute,
ich habe mich schon dusselig gesucht, aber keine elegante Lösung für folgendes Problem gefunden.

class Product
{
var $name;
[...]
}

$ProductA = new Product;
$ProductA->name = "Kaffee";
$ProductB = new Product;
$ProductB->name = "Tee";

$products = array("ProductA","ProductB");

for ($i = 0; $i < count($products); $i++)
{
echo $$products[$i]->name;
}

In PHP 5.x funktionierte das prima, in PHP 7 bekomme ich einen Fehler in der echo-Zeile gemeldet.

Mein Workaround für PHP 7 bisher:
for ($i = 0; $i < count($products); $i++)
{
$pname = $products[$i];
echo $$pname->name;
}

Geht das auch eleganter?

 
h3ll
23-08-2016, 18:21 
 
Variable Variablen sollten generell nicht verwendet werden. Das führt nur zu Müllcode.

Und "var" stammt noch von PHP 4. Wo hast du den prehistorischen Code her?

class Product {
public $name;
}

$products = array();
$products[0] = new Product();
$products[0]->name = 'Kaffee';
$products[1] = new Product();
$products[1]->name = 'Tee';

foreach ($products as $product) {
echo $product->name;
}

 
wahsaga
23-08-2016, 18:22 
 
Variable Variablen an sich waren immer schon eine Art „Workaround“ – für Sachen, die man vernünftig von vornherein anders hätte implementieren sollen/müssen.

Wenn du es jetzt eh überarbeiten musst, dann mach’s am besten auch gleich vernünftig – ohne variable Variablen. (Wie genau das im konkreten Fall aussehen könnte, kann ich dir nicht sagen, dazu ist das Beispiel zu unaussagekräftig.)

 
UlfDunkel
23-08-2016, 19:04 
 
Naja, Leute, wenn etwas in einer Sprache machbar ist, wird es auch gemacht, oder? Und die Organisation der Produkte in meinem Beispiel ist über sprechende Produktnamen wie "ProductA", "ProductB" (die natürlich total anders heißen), viel leichter zu organisieren.

Es scheint, als habe ich jetzt durch weiteres Probieren schon selbst den wohl elegantesten Weg für PHP 7 gefunden:

for ($i = 0; $i < count($products); $i++)
{
echo ${$products[$i]}->name;
}

Für den Hinweis auf "var" bedanke ich mich ebenso wie für eure Vorschläge.

 
h3ll
23-08-2016, 19:10 
 
Naja, Leute, wenn etwas in einer Sprache machbar ist, wird es auch gemacht, oder?

Nein. Man kann auch mit der deutschen Sprache viel Müll schreiben. Man muss es nicht machen, nur weil es möglich ist.

Und die Organisation der Produkte in meinem Beispiel ist über sprechende Produktnamen wie "ProductA", "ProductB" (die natürlich total anders heißen), viel leichter zu organisieren.

$products['ProductA'] = new Product();

Es scheint, als habe ich jetzt durch weiteres Probieren schon selbst den wohl elegantesten Weg für PHP 7 gefunden:

for ($i = 0; $i < count($products); $i++)
{
echo ${$products[$i]}->name;
}

Das ist das Gegenteil von elegant. Ziemlich furchtbar und umständlich.

 
UlfDunkel
23-08-2016, 19:16 
 
Guckst Du hier. (https://secure.php.net/manual/de/language.variables.variable.php)

 
h3ll
23-08-2016, 19:27 
 
Guckst Du hier. (https://secure.php.net/manual/de/language.variables.variable.php)

Ich kenn das PHP-Handbuch sicher mehr als du. Und trotzdem ändert das nichts an meiner Aussage. Entweder du profitierst aus der Erfahrung anderer Entwickler oder du bleibst stur bei deiner Einstellung und lernst selber schmerzhaft aus deinen Fehlern.

 
UlfDunkel
23-08-2016, 19:31 
 
Oh, ich wusste nicht, dass es hier üblich ist, Leute, die ne Frage stellen, pauschal erstmal für doof zu halten. Seit wann ich entwickle und programmiere und was ich gelesen habe, sagt Dir sicher Deine gläserne Kugel.

Dennoch schönen Dank. Have a nice day.

 
h3ll
23-08-2016, 19:44 
 
Oh, ich wusste nicht, dass es hier üblich ist, Leute, die ne Frage stellen, pauschal erstmal für doof zu halten. Seit wann ich entwickle und programmiere und was ich gelesen habe, sagt Dir sicher Deine gläserne Kugel.

Dennoch schönen Dank. Have a nice day.

Wenn du nicht für einen Anfänger gehalten werden willst, solltest du keine Anfängerfehler machen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:16 Uhr.