Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]konstruktor, Error: Call to a member function get() on a non-object
twojastara
post
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.11.2014

Ostrzeżenie: (10%)
X----


uczę się. Dlaczego konstruktor w wersji drugiej wywala komunikat Error: Call to a member function get() on a non-object
1.
  1. namespace AppBundle\Utils;
  2.  
  3.  
  4. class Cart {
  5.  
  6. public $request;
  7. public $session;
  8. public $cart;
  9.  
  10. public function __construct(Request $request)
  11. {
  12. $this->request = $request;
  13. $this->session = $this->request->getSession();
  14. $this->cart = $this->session->get('cart');
  15. }
  16. }


  1. $cart_obiekt = new Cart($request);

2.

  1. namespace AppBundle\Utils;
  2. use Symfony\Component\HttpFoundation\Request;
  3.  
  4. class Cart {
  5.  
  6. public $request;
  7. public $session;
  8. public $cart;
  9.  
  10. public function __construct()
  11. {
  12. $this->request = new Request();
  13. $this->session = $this->request->getSession();
  14. $this->cart = $this->session->get('cart');
  15. }
  16. }

  1. $cart_obiekt = new Cart();


Ten post edytował twojastara 16.03.2015, 21:14:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
twojastara
post
Post #2





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 25.11.2014

Ostrzeżenie: (10%)
X----


Cytat(Mariner @ 16.03.2015, 20:08:23 ) *
Ponieważ $this->request->getSession() nie zwraca obiektu.

a dlaczego ma znaczenie co zwraca?

Dla ścisłości
Error: Call to a member function get() on a non-object
wywala dla lini nr 14.
  1. $this->cart = $this->session->get('cart');



a w ogóle jak sensownie przetłumaczyć ten komunikat na polski?

Ten post edytował twojastara 16.03.2015, 23:01:32
Go to the top of the page
+Quote Post
Mariner
post
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 6
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(twojastara @ 16.03.2015, 22:49:56 ) *
a dlaczego ma znaczenie co zwraca?

Dla ścisłości
Kod
Error: Call to a member function get() on a non-object
wywala dla lini nr 14.


Ponieważ w następnej linii, właśnie nr. 14, używasz składowej session tak jak obiektu, wywołując na niej metodę get('cart'). Jak zapewne wiesz, nie można wywołać metody na zmiennej która nie przechowuje w sobie obiektu a taka próba kończy się błędem.

Powinieneś wstrzyknąć obiekt klasy Request już gotowy z zewnątrz, dokładnie tak jak w pierwszym przypadku a nie tworzyć go od nowa w konstruktorze ponieważ wtedy będzie pusty i zwracał będzie puste wartości. W drugim przypadku, sposób pozyskiwania obiektu klasy Request sprawia że jest on pusty. Nie możesz oczekiwać że już samo utworzenie obiektu Request sprawi że będzie miał on w sobie dane które może Ci zwrócić.

W systemie Symfony, obiekt Request możesz pozyskać z kontenera $request = $container->get('request'). Jeżeli masz problem z dostępem do obiektu Request w klasie Card, spraw aby obiekty klasy Cart tworzone były jako usługi (services). Przykładowy plik services.xml mógłby wyglądać tak:

CODE
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/ser...0.xsd">

<services>

<service id="app_utils.card.service" class="\AppBundle\Util\Card">
<argument type="service" id="request"/>
</service>

</services>
</container>


Dzięki temu, w kontrolerach, obiekty klasy Cart możemy pozyskiwać tak $card = $this->get('app_utils.card.service') o ile klasę Card zadeklarujesz jak w pierwszym przykładzie.
A za powoływanie obiektów klasy Card i wstrzykiwanie im obiektu Request martwił będzie się kontener zależności Symfony.

Cytat(twojastara @ 16.03.2015, 23:28:47 ) *
acha,

no tak, Mariner w pierwszej odpowiedzi pisał coś podobnego, (ale zamiast 'w konstruktorze' napisał 'w kontrolerze').


Fakt. Mój błąd, chodziło oczywiście o konstruktor a nie kontroler.
Go to the top of the page
+Quote Post

Posty w temacie
- twojastara   [PHP]konstruktor   16.03.2015, 20:01:46
- - Mariner   Ponieważ $this->request->getSession() n...   16.03.2015, 20:08:23
- - twojastara   Cytat(Mariner @ 16.03.2015, 20:08:23 ...   16.03.2015, 22:49:56
|- - Mariner   Cytat(twojastara @ 16.03.2015, 22:49...   16.03.2015, 23:50:01
- - Aqu   Odwołujesz się tutaj do metody get, więc $thi...   16.03.2015, 23:11:09
- - Damonsson   Mniej więcej tłumaczenie tak czytaj: Odwołujesz si...   16.03.2015, 23:16:30
- - twojastara   acha, no tak, Mariner w pierwszej odpowiedzi pisa...   16.03.2015, 23:28:47
- - Damonsson   Bo tworzysz nowy obiekt new Request() w którym nor...   16.03.2015, 23:46:05
- - Damonsson   Na chłopski rozum: Masz pudełko w którym trzymasz...   16.03.2015, 23:52:22
- - twojastara   dzięki Wam obu. Tylko, że ja wcale nie uważam by ...   16.03.2015, 23:59:30
- - Damonsson   Symfony robi to za Ciebie. Sprawdź: [PHP] pobierz...   17.03.2015, 00:03:17
- - twojastara   tak, to już przekonałes mnie wcześniej. Muszę się...   17.03.2015, 00:17:57
- - Mariner   Obiekty Request w kontrolerach Symfony2 są tak czę...   17.03.2015, 00:26:00
- - twojastara   Cytat(Damonsson @ 17.03.2015, 00:03:1...   17.03.2015, 00:32:36
|- - Mariner   Cytat(twojastara @ 17.03.2015, 00:29...   17.03.2015, 00:35:42
- - twojastara   Cytat(Mariner @ 17.03.2015, 00:35:42 ...   17.03.2015, 00:42:51
- - Mariner   Wybacz to pytanie ale lepiej się upewnić. Jeżeli c...   17.03.2015, 00:56:36
- - twojastara   tak, już przy wcześniejszym poście dot. xdebug zaz...   17.03.2015, 01:12:03
- - com   Poczytaj o depedency injection a zrozumiesz czemu ...   17.03.2015, 11:48:42


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.10.2025 - 08:14