Vývoj PHP v roce 2006
Školení, která pořádám
Sara Golemon shrnula vývoj kódu PHP v roce 2006 a já přináším krátké shrnutí tohoto shrnutí:
- Rozšíření Hash se dostalo do základních rozšíření a dokonce je ve výchozím stavu automaticky zapnuto. Uspěla i rozšíření JSON a Filter.
- Počítadlo referencí v PHP 4 zůstalo 16bitové.
- Do PHP 6 si po dlouhé diskusi našel cestu příkaz goto.
- Z PHP 6 zmizely direktivy safe_mode, register_globals a magic_quotes_*.
- Do PHP se nedostala direktiva
#line
ani vlastnosti tříd určené pouze pro čtení.
- Volání neexistujících funkcí a metod už nevyvolá fatální chybu, ale novou E_RECOVERABLE_ERROR.
- Direktiva unicode.semantics nepůjde nastavit v
.htaccess
ale pouze v php.ini
nebo httpd.conf
.
- Direktivu open_basedir lze při běhu skriptu zpřísnit.
- Navržená podpora taint režimu se do PHP pravděpodobně nedostane.
- Úprava funkcí pro podporu Unicode překročila hranici 50 %.
Diskuse
Messa:
Nebude safe_mode? Jak bude vyřešena otázka bezpečnosti (při přístupu k souborům apod.)?
spaze:
open_basedir poskytuje *jinou* ochranu, než safe mode.
Ondrej Ivanic:
Ano inu, inteligentnesiu. safe_mode bola nocna mora. Jediny chybajuci rozdiel (pre mna) je to ze mozno by bolo mat vhodne nieco ako exec_basedir...
jirka:
Výše uvádíte: "Direktivu open_basedir lze při běhu skriptu zpřísnit". Funkce ini_set() mi vrací původní nastavení. Mohl by jste mi, prosím, poradit?
Jakub Vrána :
Tato funkčnost je k dispozici až v PHP 6.
Jan Tichý:
V kostce lehce nadneseně shrnuto, direktiva safe_mode nebude potřeba, protože většina nastavení bude v PHP 6 v defaultní nezměnitelné podobě ve své přísné podobě, takže PHP 6 se bude vždy chovat tak, jako by safe_mode bylo zapnuté, ovšem s důrazem na správné využití open_basedir.
dgx:
> Z PHP 6 zmizely direktivy ... magic_quotes_*.
To bude mít docela zdrcující dopad na tento blog, že? :-))
Jakub Vrána :
Pouze vyměním informaci v patičce za filter.default=magic_quotes.
dgx:
Rýpu si, rýpu.
Není Jakube už načase se na magic_quotes skutečně vykašlat? V příkladech místo query("SELECT ... WHERE X = '$_GET[x]'") začít psát query("SELECT ... WHERE X = '$x'") atd... Mohl bys pak parametry ošetřovat pomocí strlen(), substr(), používat PDO, ... A hlavně: dalo by se s parametry dělat i něco trošku jiného, než je jen a pouze vkládat do SQL příkazu.
Jakub Vrána :
Na <?php $x = mysql_real_escape_string($_GET["x"]); mysql_query("SELECT '$x'"); ?> přecházet nehodlám. Na vázání proměnných v podání PDO časem přejdu, ale asi ne na tomto blogu. Předělávat všechny příklady se mi nechce a mít je nekonzistentní taky ne.
rezna:
hmm ja nevim, vy pisete v PHP dlouuuuuho a za tu dobu jste si nenapsal rozumne funkce/tridy pro praci s SQL? :) - IMHO je zakladem rozumne psaneho projektu aspon fukce a la
DO_Query("SELECT * FROM table WHERE column = '@x@', array('x' => 'neco'))
minimalne toto zarucuje rozumne skladani SQLka, jeho prehlednost a hlavne jednotnou kontrolu nad vstupem
Jakub Vrána :
Ano, vázání proměnných je dobrý koncept. Ale spíš než doma-upečené řešení mám raději nějaké standardní. Proto se mi líbí PDO.
rezna:
ja tohle psal uz pred PDO inspirovan tim co maji v .NETu - co jsem neresil je jeste typovani - to by tam byt melo - v .NETu lze elegantne tahle kontrolovat na parametrech i typy, pripadne si vynutit prevod
uzivatel:
Odporucam zabrusit do databazovej vrstvy frameworkov CodeIgniter alebo CakePHP, PDO sa dlho dobu v jednoduchosti urcite nechyti.
Jakub Vrána :
Všechny příklady jsem předělal a blog nyní předpokládá vypnuté magic_quotes_gpc.
Jakub Vrána :
Celkem 90 minut. Na to, že jsem se k tomu rozhoupával asi dva roky, to je docela málo :-).
L.:
Kdo proboha potřebuje goto??? A k čemu?
Jakub Vrána :
Rozumně se dá použít např. k ošetřování chyb.
error414:
Sam vis ze PHP je jazyk kde se vetsina lidi uci programovat. Podle toho nektere scripty jsou tak hruzostrasne. GOTO zavede takove nove konvece ze se vtom nikdo nevyzna. To jsou moje vzpominky na Pascal a GOTO peklo.
Štěpán Svoboda:
JO!
Pod to bych se podepsal :)
Příklad:
<?php
class User
{
private
$Id,
$Name,
$Email;
public function getId()
{
return $this->Id;
}
public function setId($Id)
{
$this->Id = $Id;
}
public function getName()
{
return $this->Name;
}
public function setName($Name)
{
$this->Name = $Name;
}
public function getEmail()
{
return $this->Email;
}
public function setEmail($Email)
{
$this->Email = $Email;
}
public function import($source = 'Row', $data = false)
{
switch ($source) {
case 'Row': {
if (!$data) {
if (!$this->getId()) {
throw new Exception('User::import() - Cannot import: no data, unknown Id');
}
else {
$conn = Connector::get();
$data = $conn->fetchRow("SELECT * FROM".tableUser." WHERE Id = {$this->getId()}");
}
}
$messages = array();
try {
label%begin;
if (!array_key_exists('Id', $messages)) {
$this->setId(validate::Id($data['Id']));
}
if (!array_key_exists('Name', $messages)) {
$this->setName(validate::Name($data['Name']));
}
if (!array_key_exists('Email', $messages)) {
$this->setEmail(validate::$data['Email']);
}
}
catch (Exception $e) {
$messages['Id'] = $e->getMessage();
goto %begin;
}
}
}
$this->setId();
}
}
?>
Štěpán Svoboda:
:)
místo toho co je v příkladu má být:
<?php
catch (Exception $e) {
$messages[$e->getProperty()] = $e->getMessage();
goto %begin;
}
?>
museli bychom mít nadefinovanou nějakou jinou třídu vyjímek ale to už nesouvisí s problémem...
Jakub Vrána :
Tohle se dá vyřešit pomocí
<?php
while (true) {
try {
} catch (Exception $e) {
continue;
}
break;
}
?>
Štěpán Svoboda:
Tohle mne nenapadlo. Abych se přiznal tak s whilem nejsem moc dobrej kamarád :) Asi pzůstatek z Pascalu, který zde již někdo zmínil.
To error414: Prasácky se dá programovat s goto i bez něj...
rezna:
GOTO je silenost - a uz vubec ne k osetrovani chyb - k tomu je konstrukce try{}catch{} a cykly
jak je videt vyvojari jsou celkem mimo - radsi kdyby tam cpali rozumny veci
Jakub Vrána :
Vývojáři jsou možná z tvého pohledu mimo, ale třeba psaní parseru s důrazem na výkon je s konstrukcí goto mnohem elegantnější a try-catch v tom nijak nepomůže.
Nicméně souhlasím, že se goto bude častěji spíše zneužívat, proto je jeho funkčnost také značně omezena.
Honca:
Chci se zeptat, jestli je někde možný (nebo bude možný) sehnat zdrojový kódy standardních funkcí v PHP...
Diskuse je zrušena z důvodu spamu.