Autor Zpráva
RickAndMorty
Profil *
Dobrý den,
již delší dobu se snažím přijít na způsob jak vypsat nějaký prvek, který přetypuji na object.

Mám následující kod:
$object = (object) [
    0 => '0. hodnota',
    1 => '1. hodnota',
    2 => '2. hodnota'
];

var_dump($object->{'1'}); // NULL

echo $object->{'1'};
echo $object->{"1"};
echo $object->1;

A očekávaným výsledkem je vypsat "1. hodnota". Na webu jsem našel tyhle tři řešení, ale ani jedno nefunguje. Vím že mohu objekt změnit na array a z něj data vypsat, ale chtěl bych to udělat nějakým způsobem úhledně bez nutnosti přetypování. Tohle je jednoduchý případ užití. V praxi to samozřejmě využiji jinak.

Předem děkuji za jakoukoliv pomoc.
Keeehi
Profil
$object->{1}

Dělat z pole objekt jen aby to bylo víc cool je zbytečnost. Co má ten objekt navíc co neumí pole?
RickAndMorty
Profil *
Převáženě to používám u výpisu z databáze, nebo načítání konfigurace z JSON souboru.

$object = (object) [
    0 => '0. hodnota',
    1 => '1. hodnota',
    2 => '2. hodnota'
];

var_dump(
    $object->{1}
);

echo $object->{1};

var_dump vrací NULL a u echo se nevypíše nic. Asi to s verzí nemá nic společného, ale přeci jen používám PHP 7.1 na Linuxovém serveru.
Radek9
Profil
RickAndMorty:
Evidentně to v tomto případě nejde. (Snad nevadí angličtina, je to tam vysvětleno hezky.) Pokud opravdu potřebuješ pole přetypovávat na objekt, vyhni se číselným názvům. Případě si můžeš napsat nějaký vlastní wrapper:

<?php
class ArrayWrapper {
  private $array;
  
  public function __construct(array $array) {
    $this->array = &$array;
  }

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

  public function &__get($name) {
    return $this->array[$name];
  }
}

$object = new ArrayWrapper([
  0 => '0. hodnota',
  1 => '1. hodnota',
  2 => '2. hodnota'
]);
 
var_dump(
  $object->{1}
);
 
echo $object->{1};
Keeehi
Profil
RickAndMorty:
Asi to s verzí nemá nic společného, ale přeci jen používám PHP 7.1
Ale má. Zapomněl jsem, že bych si měl zkontrolovat kompatibilitu. Testoval jsem to v 7.2. Tam to fungovat bude.

Nicméně, je jedno kde to používáš. Já jsem se ptal na výhody objektu oproti poli. Žádné jsi neuvedl. Tak používej pole a buď šťasten.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: