Autor Zpráva
midlan
Profil
Ahoj,
na localhostu mi autoloading funguje bezvadně, ale na serveru nikoliv. Vyzkoušel jsem už snad všechny můžné způsoby, ale žádný nefunugje. Už mě napadá jen, že to může být rozdílností webserverů. Na localhostu mám windows PHP 5.3.13 jako modul apache, na serveru máme linux nginx a PHP 5.5.2 jako FastCGI.

Vytvořil jsem testovací skript, na localhostu funguje přesně podle očekávání. Ke stažení zde.

Pro ty co nechtějí stahovat, obsah spouštěcího skriptu:
<?php

header('Content-Type: text/html; charset=UTF-8');

set_include_path('.'.DIRECTORY_SEPARATOR.'libs');
echo 'Sucessfuly registred: ';
var_export(spl_autoload_register());
echo '<br />';

$obj = new Trida;
$obj->ahoj();

Ve složce se spouštěcím skriptem je složka "libs" a v ní soubor Trida.php, jeho obsah:
<?php

echo 'Class file was sucessfully loaded!<br />';

class Trida {
  public function ahoj() {
    echo "metoda ahoj<br />";
  }
}

výstup skriptu na serveru je následující:
Sucessfuly registred: true

Fatal error: spl_autoload(): Class Trida could not be loaded in /usr/share/webapps/dev-midlan/run.php on line 10

EDIT: ještě doplním, že include path se nastavuje také úspěšně (po zavolání get_include_path() vrací tu, která byla nastavena)
abc
Profil
Nevím, zda to takto lze nebo ne, ale připadá mi to jako nesmysl.
Proč to neuděláš stejně jako je to v Example 1 v dokumentaci? http://cz2.php.net/function.spl_autoload_register
Davex
Profil
midlan:
Ve složce se spouštěcím skriptem je složka "libs" a v ní soubor Trida.php
Zkus soubor Trida.php přejmenovat na trida.php s malým t na začátku.
juriad
Profil
midlan:
Zapomněl jsi uvést, že ukázka funguje na Windows (nerozlišuje velikost písmen), ale ne na Linuxu (na veliksti záleží).
Podle dokumentace spl_autoload dostává funkce název třídy malými písmeny.

Zmiňuje to někdo i v komentáři http://cz2.php.net/manual/en/function.spl-autoload.php#98762
midlan
Profil
abc:
Nesmysl to není, lépe si prostudujte dokumentaci, kterou jste sám zaslal.

Davex:
juriad:
Máte oba pravdu, je to tím velkým písmenem. Měl jsem zato, že jsem otestoval i tohle.

juriad:
Zapomněl jsi uvést, že ukázka funguje na Windows (nerozlišuje velikost písmen), ale ne na Linuxu (na veliksti záleží).
Na localhostu mám windows PHP 5.3.13 jako modul apache, na serveru máme linux nginx a PHP 5.5.2 jako FastCGI.


Bylo by možné nějakým způsobem tu velikost písmen zachovat? Přecijen u složených názvů tříd je to přehlednější.
juriad
Profil
midlan:
Ou, to se omlouvám; hlavně, že jsem si přečetl a porovnal verze PHP a HTTP serverů :)

Zachovat velikost písmen nejspíš nepůjde; ta funkce je podle komentáře z důvodu rychlosti implementovaná přímo v C a tam nemáš šanci ji nějak pozměnit (bez kompilace vlastní opatchované verze PHP).
Ale mohl bys po vzoru odkázaného komentáře přidávat například podtržítko před každé neprvní velké písmeno v původním názvu třídy.
Takže třída PejsekAKocicka by byla v souboru pejsek_a_kocicka.php
midlan
Profil
juriad:
To je škoda. Moc nechápu proč to autor té funkce udělal takhle :(

S těmi podtržítky by to nešlo, protože funkce spl_autoload nejenže hledá soubor s tím názvem, ale po načtení toho souboru si ověřuje i existenci požadované třídy (název třídy musí odpovídat názvu souboru). Navíc se mi to nelíbí. Budu se muset spokojit se zmenšenými názvy souborů.

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: