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
Nechce se mi nad tím moc přemýšlet, ale začal bych tím, že bych vyhodil ty reference (&).
Petr Ká
Profil
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
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
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
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
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...

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: