Comments (7)
BaseException jsem udělal jako předka všech vyjímek co vyhazuje knihovna, aby se jednoduše dalo zjistit, že chyba jde z komunikace se skautisem.
Funkce setStorage má využití, pokud si chceš nastavit vlastní místo pro uložení informací ať kvůli zvyklosti či bezpečnosti. Já to využívám s Nette pro nastavení uložiště přes Nette Session, protože jsem měl problém s přemazáváním. Takto mám vše pod Nette Session a jede to vpohodě.
from skautis.
Problem je ze BaseException neni nikde deklarovan. Tedy pri pokusu vytvorit a hodit vyjimku aplikace spadne.
setStorage bohuzel nefunguje presne tak jak by mela. V kodu je priklad:
příklad použití: $skautIS->setStorage(&\Nette\Environment::getSession()->getSection("__" . __CLASS__), TRUE);
volani funkce(&promenna) bylo odstraneno z PHP. (V PHP5.4+ fatal error)
Z dokumentace:
Note: There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
Tedy na serverech s aktualnim PHP funkce funguje tak ze pole apod. se predaji hodnotou, coz neni uplne to co je zamysleno (z toho co jsi psal). Take by nebylo spatne v definici funkce type hintnout ArrayAccess, ktery je potrebny pro spranvou manipulaci s ukladani dat. Na druhou ArrayAccess neni kompatibilni s array (trochu na hlavu). Ovsem pokud by se vynucoval ArrayAccess, musel by to byt objekt -> automaticky predavan referenci.
from skautis.
Omlouvám se, měl jsem konflikt při psuh a nevšiml jsme si ho, už je to tam.
K setStorage jsem doplnil type hint, jak jsi psal (https://github.com/sinacek/SkautIS/blob/master/src/SkautIS/SkautIS.php#L161).
Co se týká předávání referencí, tak to co píšeš je, když bych měl referenci v deklaraci třídy a ne ve volání funkce. Chvilku to bylo špatně, ale od doby co tam je příklad, tak by to mělo být už ok.
from skautis.
Tohle je pouze pro dokumentaci, type hint by byl takhle:
public function setStorage(ArrayAccess $storage, $leaveValues = false) {
}
Naopak, reference se maji vynucovat pri definici funkce. Pro jistotu jsem to zkousel a funkce(&promenna) mi spadne (PHP 5.4)
from skautis.
Jo, tak vynucovat to nehci, už z toho důvodu co píšeš nahoře. Chci možnost zadat array i ArrayAccess, je to tak marginalni funkciolita podle mě, že by si uživatel měl načíst dokumentaci co tam má poslat.
Když udělam deklaraci public function setStorage(&$storage, $leaveValues = false) {...}, tak pak mi to hází chybu "PHP Strict standards: Only variables should be passed by reference in ..." na PHP 5.4.4
from skautis.
Ono je tam problemu vic, tady je ukazka tech ktere me napadli pri cteni kodu.
S polem to stejne nefunguje. (protoze se tam pristupuje ->init["cokoliv"]) Muselo by se pole pretypovat na objekt ($skautIS->setStorage((object)$arr);)
$skautIS = \SkautIS\SkautIS::getInstance();
$arr = array();
$skautIS->setStorage($arr);
$skautIS->setAppId("123a456b789d"); //PHP Warning: Attempt to modify property of non-object in
Predani reference za behu 5.4+nefunguje
//error_reporting(0); // aby se to nezasavilo pri warningu
require 'vendor/autoload.php';
$skautIS = \SkautIS\SkautIS::getInstance();
$arr = array();
$skautIS->setStorage(&$arr); // PHP Fatal error: Call-time pass-by-reference has been removed in
$skautIS->setAppId("123a456b789d"); // neprovede se
var_dump($skautIS->getAppId()); // neprovede se
S objektem funguje spravne i bez &. Naopak s & spadne
error_reporting(0); // aby se to nezasavilo pri warningu
require 'vendor/autoload.php';
$skautIS = \SkautIS\SkautIS::getInstance();
$obj = new stdClass();
$skautIS->setStorage($obj);
$skautIS->setAppId("123a456b789d");
var_dump($skautIS->getAppId() === $obj->init['ID_Application']);
Co se tyce toho `PHP Strict standards: Only variables should be passed by reference``
Tak problem je nejspis v tom ze tam nedavas promenou ale data vytvaris ve volani fce, tedy takhle:
function zmenPole(&$arr) {
$arr[0] = "NE";
}
// Nemam vytvorenou promenou, proto nemuzu z ni vzit referenci.. a proto ji nemuzu predat funkci
zmenPole(array());
Spravne je to takto
function zmenPole(&$arr) {
$arr[0] = "NE";
}
$mojePole = array("ANO");
echo $mojePole[0]; //ANO
echo "-";
// tady mam z ceho vzit referenci
zmenPole($mojePole);
echo $mojePole[0]; //NE
Pokud jsi pro, mohl bych doplnit nejake unit testy
from skautis.
Tak já to mám u sebe jinak než jsem si myslel, mam to použité bez referencí(upravil jsem tedka i zdrojak). Ta moje chyba se vyřešila, když jsem to rozdělil na dva řádky.
$storage = \Nette\Environment::getSession()->getSection("" . __CLASS);
$this->context->skautIS->setStorage($storage, TRUE);
Ok, upravil jsem to podle tvých rad, díky.
Určitě budu rád za cokoliv, čím někdo přispěje ke knihovně, takže i za unit testy.
from skautis.
Related Issues (20)
- Použití magických metod (`Skautis::__get()`) znemožňuje statickou analýzu
- Skrytá zbytečná závislost na Dibi HOT 1
- Notice: neinicializované $s HOT 1
- Trace nemusí obsahovat line HOT 3
- Session Storage problem HOT 8
- BatchRequest SOAP HOT 1
- Notice: Array to string conversion as WS.php:92 HOT 5
- Coding style HOT 4
- CacheDecorator pro WebService HOT 12
- Nevhodně se chovajíci isMaintenance při nenalezení domeny HOT 1
- Jméno balíčku a namespace HOT 7
- Nefunkční odkaz v dokumentaci HOT 3
- getLoginUrl(id,true) vrací http:// scheme HOT 1
- Nahradit vlastni CacheInterface za PSR cache HOT 1
- Pridat logovani HOT 1
- Update PHP
- Chyba parseOutput HOT 12
- Nahrazení SoapClient za nějakou rozumnější abstrakci HOT 13
- Kompatibilita s PHP 8.1 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from skautis.