Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

PHP hádanka IV.

Minule jsem sliboval, že dnes bude něco těžšího. A taky že jo! I když se to zdá na první pohled jasné, zdání může klamat. Tak tedy, jakou hodnotu bude mít na konci skriptu proměnná $foo?

function setFoo(&$value) {
  global $foo;
  $foo = & $value;
}

$foo = 123;
$bar = 777;

setFoo($bar);

echo $foo;

clock 11. 11. 2004 pencil PHP comments Komentáře: 21


PHP hádanka III.

Je pondělí a s ním „pravidelná“ hádanka pro PHP kódéry. Chtěl jsem původně přijít s něčím složitějším, ale nechám si to na čtvrtek, přece jen po víkendu hlava ještě tak nepracuje.

Dnešní otázka tedy zní: jakou hodnotu bude mít $a?

$a = 123;
$b = & $a;
$a = & $b;

echo $a;

clock 8. 11. 2004 pencil PHP comments Komentáře: 9


PHP hádanka II.

Dnes to bude spíš oddechovka. Otázka zní: co se stane s polem $a v bodech 1 a 2?

$a = array(1 => 'první');

// bod 1
$ref = & $a[2];

// bod 2
$ref = 'druhá';

clock 4. 11. 2004 pencil PHP comments Komentáře: 3


První PHP hádanka

Inspirován programátorskými hádankami Reného Steina bych rád podobnou kratochvíli dopřál i znalcům PHP. Pro začátek takový chyták: Co vypíše příkaz echo?

class Foo {
  var $self;
  var $bar = 11;

  // constructor
  function Foo() {
    $this->self = & $this;
  }
}

$foo = new Foo();
$foo->bar = 22;
echo $foo->self->bar;

clock 1. 11. 2004 pencil PHP comments Komentáře: 14


Asociativní pole v Delphi

Včera jsem psal o tom, jak těžké jsou návraty k Delphi, když Vás rozmazlí PHP. Kromě chybějící podpory pro Automatickou Správu Paměti je tu ještě jedna věc, kterou jsem citelně postrádal. A tou je asociativní pole.

Ale i tento problém už je pro mě minulostí :-) Může být i pro Vás, stačí stáhnout tento šikovný unit hashes.pas a hned můžete začít asociovat co hrdlo ráčí. Pokud nevíte, co to asociativní pole je, čtěte dál a soubor si určitě stáhněte. Získáte velmi šikovné rozšíření pro Delphi. Rozšíření těžkého kalibru.

Co je asociativní pole

K prvkům obyčejného pole přistupujeme pomocí čísel, tedy indexů. První prvek pole je například foo[0], druhý foo[1], atd. V případě asociativního pole se k prvkům přistupuje pomocí řetězců (klíčů). To se na první pohled nejeví jako žádná senzace, ale už na druhý pohled zjistíte, jaké nebývalé možnosti to skýtá. Podívejte se třeba na příklad:

pole['nazev'] := 'Siemens S65';
pole['barva'] := 'šedá';
pole['kod'] := '22143x';
if (pole['kod'] = '22143x') then ...

Počet prvků v poli se samozřejmě může dynamicky měnit. Rychlý přístup k položkám zajišťuje mechanismus zvaný hashování (proto se unit jmenuje hashes.pas).

Teď už víte, že asociativní pole není pole, které okopávají asociálové, nýbrž skvělý nástroj programátora.

Dokumentace

V knihovně je definovaná základní třída THash a její dva následníci:

  • TStringHash – prvky pole jsou řetězce String
  • TIntegerHash – prvky pole jsou celá čísla Integer

S popisem třídy THash budeme rychle hotovi: nikdy ji nebudete ve svých aplikacích potřebovat. Slouží jen jako základ pro zmíněné následníky.

A nyní se podíváme na zoubek třídě TStringHash.

Nejprve vytvoříme pole, tedy objekt:

arr := TStringHash.Create();

Asociativní pole rozlišuje u klíčů velká a malá písmenka. Tedy arr['AHOJ'] a arr['Ahoj'] nejsou tytéž prvky. Rozlišování je však možné vypnout – nastavením vlastnosti CaseSensitive na hodnotu false. Tuto vlastnost lze nastavit jen v případě, že je pole prázdné (nejlépe tedy hned po vytvoření objektu). Jinak dojde k vyvolání výjimky. (nerozlišování velkých a malých písmen PHP neumí).

Do asociativního pole můžeme vkládat hodnoty:

arr['key1'] := 'Hello';
arr['key2'] := 'Word';
arr['key2'] := 'World'; // přepíše původní hodnotu

A také z něj číst:

s := arr['key1'];
if (arr['key2'] = 'World') then ...

Abyste měli při práci s polem ještě více pohodlí, doplnil jsem objekt o další vychytávky, které umožní zapisovat a číst i jiné typy, než jen string:

…pokračování continue

clock 27. 10. 2004 pencil PHP comments Komentáře: 2


phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.