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;
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;
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á';
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;
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:

novější články