| Autor | Zpráva | ||
|---|---|---|---|
| Petr Ká Profil |
Ahoj,
už pár dní si lámu hlavu s vytvořením továrničky na služby (vlastní framework) podle configu a potřeb (LAZY). Když vytvářím třídy/služby s žádným nebo jedním parametrem, je vše v pořádku, služba se vytvoří, uloží a předá. Problém mi nastává, když potřebuji vytvořit třídu/službu s více parametry... Ať zkouším cokoliv (6x jsem vše přepisoval uplně jinýmy způsoby a nic), tak mi PHP vyhazuje "Catchable fatal error" (Špatné parametry). Pro ukázku jak to právě řeším (jeden ze 6ti nefunkčních způsobů): <?php
/**
* @param string $name - Service name
* @return object
* @throws \PKRS\Core\Exception\ServiceException
*/
private function create_service_object($name){
$name = strtolower($name); // fix - service name only small letters
if (!in_array($name, array_keys($this->services))){ // is service defined?
throw new \PKRS\Core\Exception\ServiceException("Service $name not defined");
} else {
// yes, service defined
if (in_array($name, array_keys($this->objects))){
// we have object - return it
return $this->objects[$name];
} else {
// object not created - create it
$service = $this->services[$name];
$class = "\\".str_replace("/","\\",trim($service["class"],"/"));
$params = array();
foreach($service["params"] as $param){
// recursive get/create params
$object = $this->get_service($this->get_service_name_by_class($param["value"]));
$params[] = &$object;
}
$reflection = new \ReflectionClass($class);
$object = $reflection->newInstanceArgs($params); // <-- here is ERROR
// register service object
$this->objects[$name] = &$object;
// return new object
return $this->objects[$name];
}
}
}Konkrétně dostávám zprávu: Catchable fatal error: Argument 2 passed to PKRS\Core\User\User::__construct() must be an instance of PKRS\Core\Database\Database, instance of PKRS\Core\Config\Config given in Konstruktor třídy PKRS\Core\User\User: function __construct(\PKRS\Core\Config\Config &$config,\PKRS\Core\Database\Database &$db){
$this->db = $db;
$this->config = $config;
.
.
. |
||
| Jan Tvrdík Profil |
#2 · Zasláno: 4. 11. 2014, 16:58:57
Nechce se mi nad tím moc přemýšlet, ale začal bych tím, že bych vyhodil ty reference (
&).
|
||
| Petr Ká Profil |
#3 · Zasláno: 4. 11. 2014, 17:04:36
Jan Tvrdík:
Ahoj Honzo, díky za bleskovou odpověď. Ok, vyhodil jsem je, nicméně stejně to nepomáhá (logicky). Zkoušel jsem parametry nasadit i přes: $object = call_user_func_array( array(new ReflectionClass($class), 'newInstance'), $params ); Se stejným výsledkem |
||
| Jan Tvrdík Profil |
#4 · Zasláno: 4. 11. 2014, 17:08:07
Petr Ká:
Jestli to nepomohlo, tak si tu chybu budeš muset najít sám. Koukni, co je v $service["params"] a následně pak v $params.
|
||
| Zechy Profil |
Dle té chybové hlášky předáváš jako druhý parametr config třídu a né database. A dle konstruktoru máš předat config a pak database.
|
||
| Petr Ká Profil |
Zechy
Ano, to mi došlo... Jan Tvrdík: Dokonalé, když jsem vyhodil reference všude, tak to šlape. Nevím proč (asi ty reference), ale parametry se přepisovali následujícími (v té rekurzi), takže jsem předával: Array ( [0] => PKRS\Core\Config\Config [1] => PKRS\Core\Config\Config ) DÍKY!!! Ušetřil jsi mi spousty hodin!! :) |
||
| Jan Tvrdík Profil |
Petr Ká:
Já hlavně nechápu, odkud jsi vykoukal tak nesmyslné použití referencí. Jsi studoval materiály z doby PHP 4? |
||
| Petr Ká Profil |
#8 · Zasláno: 4. 11. 2014, 17:32:21
Jan Tvrdík:
Tak to už nevím, je to hodně historická věc, kterou jsem si osvojil návykem z dávných dob... Ale to už je víceméně off topic. |
||
| Jan Tvrdík Profil |
#9 · Zasláno: 4. 11. 2014, 17:35:51
Petr Ká:
Offtopic to není, protože materiály, co učí lidi takhle používat reference by měly být opraveny nebo zničeny. Znát zdroj nesmyslů pomůže (obecně) k jejich eliminaci. |
||
| Petr Ká Profil |
#10 · Zasláno: 4. 11. 2014, 17:45:42
Jan Tvrdík:
To je pravda. Vlastně i já se teď poučil a donutilo mě si přečíst něco aktuálního o referencích v PHP5... |
||
|
Časová prodleva: 11 let
|
|||
0