Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]protected z tablicy jak to ugryźć ?
Forum PHP.pl > Forum > Przedszkole
casperii
Panowie nie rozumiem do końca zasady protected.

  1. class JakasKlasa {
  2. protected $_session;
  3.  
  4. public function Logowanie() {
  5. $session = 'zmienna';
  6. $this->_session = $session;
  7. }
  8. }
  9.  
  10. try {
  11. $test = new JakasKlasa();
  12. $test->Logowanie();
  13. }


i jak wstawić w Logowanie tą $session ?

printowanie $test daje nam
  1. JakasKlasa Object
  2. (
  3. [_session:protected] => Array
  4. (
  5. [session-handle-part] => wartosc
  6. )
  7. )



w jaki sposób mam pobrać to co jest w session-handle-part ?
viking
public function getSession() {
return $this->_session;
}

$test->getSession()['session-handle-part];
viking
Ciekawe http://sandbox.onlinephpfunctions.com/code...53abf4e4b8666aa

To znaczy że masz PHP jakiegoś starocia 5.3. Array dereferencing było od 5.4.
vokiel
Cytat(casperii @ 22.06.2017, 22:37:54 ) *
Panowie nie rozumiem do końca zasady protected.

Protected określa zasięg widoczności do danej klasy i klas po niej dziedziczących.

  1. class A
  2. {
  3. protected $foo;
  4.  
  5. public function getFoo()
  6. {
  7. return $this->foo;
  8. }
  9. }
  10.  
  11. class B extends A
  12. {
  13. public function setFoo($foo)
  14. {
  15. $this->foo = $foo;
  16. }
  17. }
  18.  
  19. // Widoczność w klasie dziedziczącej
  20. $objB = new B();
  21. $objB->setFoo('bar');
  22. echo $objB->getFoo(); // bar
  23.  
  24. // Ale te dwa użycia już nie zadziałają
  25. // PHP Warning: Uncaught Error: Cannot access protected property B::$foo
  26. $objB->foo = 'bar';
  27.  
  28. $objA = new A();
  29. $objA->foo = 'bar';


Cytat(casperii @ 22.06.2017, 22:37:54 ) *
i jak wstawić w Logowanie tą $session ?


Przez przekazanie parametru (może być w konstruktorze, albo w samej funkcji Logowanie:
  1. class JakasKlasa
  2. {
  3. protected $_session;
  4.  
  5. public function Logowanie($session)
  6. {
  7. $this->_session = $session;
  8. }
  9. }
  10.  
  11. // Użycie
  12. $session = 'jakas-sesja';
  13. $test = new JakasKlasa();
  14. $test->Logowanie($session);


Cytat(casperii @ 22.06.2017, 22:37:54 ) *
w jaki sposób mam pobrać to co jest w session-handle-part ?


Ustawić setter tak jak napisał @viking
  1. class JakasKlasa
  2. {
  3. protected $_session;
  4.  
  5. public function Logowanie($session)
  6. {
  7. $this->_session = $session;
  8. }
  9.  
  10. public function getSession()
  11. {
  12. return $this->_session;
  13. }
  14. }
  15.  
  16. // Użycie
  17. $session = 'jakas-sesja';
  18. $test = new JakasKlasa();
  19. $test->Logowanie($session);
  20. // Pobranie sesji
  21. $pobrana_sesja = $test->getSession();
Pyton_000
protected najłatwiej określić jako własność klasy która nie jest dostępna publicznie ale jest dziedziczona. Natomiast private nie jest dziedziczona i dla tego wywala error w 2-gim przykładzie.

  1. <?php
  2.  
  3. class A {
  4. protected $a = ';;';
  5. }
  6.  
  7. class B extends A {
  8.  
  9.  
  10. public function show() {
  11. echo $this->a;
  12. }
  13. }
  14.  
  15.  
  16. class C {
  17. private $a = ';;';
  18. }
  19.  
  20. class D extends C {
  21.  
  22.  
  23. public function show() {
  24. echo $this->a;
  25. }
  26. }
  27.  
  28. echo (new B())->show();
  29. echo (new D())->show();
casperii
ok zrozumiałem, jeszcze mam pytanie odnośnie tego:

  1. public function MyAccountItemsCount($Options) {
  2. $this->checkConnection();
  3. return $this->_client->doMyAccountItemsCount(
  4. $this->_session['session-handle-part'], $Options['account-type'], $Options['items-array']
  5. );
  6. }


to co powinienem przekazać w ()?

  1. $count = $api->MyAccountItemsCount()
Pyton_000
tablicę... no chyba podstawy już w końcu opanowałeś...
markuz
No ale przecież w metodzie masz użyte klucze:
$Options['account-type'], $Options['items-array']
A ty przekazujesz klucze 0, 1 i 2.

Poza tym nie nazywaj zmiennych/metod z dużej litery.

Powinien Ci wyskoczyć błąd "undefinex index X in array"..
casperii
@markuz dzięki.
Może komuś się przyda:


  1. $domyaccountitemscount_request = array(
  2. 'session-handle-part' => ''.$sess.'',
  3. 'account-type' => 'sold',
  4. 'items-array' => array()
  5. );
  6.  
  7. $county = $api->MyAccountItemsCount($domyaccountitemscount_request);


A proszę napisz mi co w tym przypadku należy przekazać do funkcji MyBilling() ?

  1. public function MyBilling() {
  2. return $this->_client->doMyBilling(
  3. self::COUNTRY_CODE
  4. );
  5. }
  6.  
  7. $billing = $api->MyBilling()



gdyż wg. dokumentacji
  1. $domybilling_request = array(
  2. 'sessionHandle' => '22eb99326c6be29aa16d07d622bcfbcbee94ad54846f2f4e03_1'
  3. );

markuz
Nic. Ta metoda nie ma żadnych argumentów przecież.

Chyba, że chodzi Ci o $this->_client->doMyBilling, ale nie wiem co masz do niej przekazać nie znając kodu. Pokaż dokumentację albo źródła.
casperii
źródło: http://allegro.pl/webapi/documentation.php...09#method-input

Nie przekazanie niczego wywala błąd:
Błędny identyfikator sesji. Proszę spróbować zalogować się jeszcze raz!
markuz
A więc:
  1. $domybilling_request = array(
  2. 'sessionHandle' => '22eb99326c6be29aa16d07d622bcfbcbee94ad54846f2f4e03_1'
  3. );

gdzie sessionHandle to:
Cytat
Identyfikator sesji użytkownika, uzyskany za pomocą metody doLogin(Enc).

Czyli najpierw musisz wywołać doLogin żeby uzyskać id sesji.

doLogin zwraca:
  1. $dologin_response = array(
  2. 'sessionHandlePart' => '22eb99326c6be29aa16d07d622bcfbcbee94ad54846f2f4e03_1',
  3. 'userId' => 4109848,
  4. 'serverTime' => 1269814134
  5. );

To sobie musisz zapisać w tej klasie czy gdzie tam chcesz.
casperii
a nie lepiej zrobić tak:

  1. public function MyBilling() {
  2. return $this->_client->doMyBilling(
  3. self::COUNTRY_CODE, $this->_session['session-handle-part']
  4. );
  5. }


dodając do funkcji session-handle-part

sesje wcześniej pobieram i jak printuje to ona jest dostępna.

funkcje login i getsession mam:
  1. public function LoginEnc() {
  2. $version = $this->QuerySysStatus(1);
  3. $this->_local_version = $version['ver-key'];
  4. //do
  5. $session = $this->_client->doLoginEnc(
  6. $this->_config['allegro_login'], $this->_config['allegro_password'], self::COUNTRY_CODE, $this->_config['allegro_key'], $version['ver-key']
  7. );
  8. $this->_session = $session;
  9. unset($this->_config['allegro_password']);
  10. }
  11.  
  12. public function getSession() {
  13. $this->checkConnection();
  14. return $this->_session['session-handle-part'];
  15. }

markuz
Oczywiście, że możesz tak zrobić - tylko poproś Allegro żeby przebudowali swoje API.

Według powyższego kodu twoja metoda MyBilling powinna wyglądać tak:

  1. public function MyBilling() {
  2. return $this->_client->doMyBilling([
  3. 'sessionHandle' => $this->_session['sessionHandlePart']
  4. ]);
  5. }


Nazywaj metody z małej litery.
Naucz się rozróżniać, że sessionHandlePart to coś innego od session-handle-part.

Twoja metoda checkConnection robi nie to co trzeba. Ona nie sprawdza czy użytkownik jest już zalogowany tylko go loguje za każdym razem - co jest błędem.
markuz
  1. public function MyBilling() {
  2. return $this->_client->doMyBilling(
  3. // self::COUNTRY_CODE
  4. 'sessionHandle' => $this->_session['sessionHandlePart']
  5. );
  6. }

Co to jest? Powinno Ci wypluć błędy składniowe..
Tam jest tablica, obuduj to w array() albo [].
casperii
ha! działa:
  1. public function MyBilling() {
  2. return $this->_client->doMyBilling(
  3. self::COUNTRY_CODE,
  4. $this->_session['session-handle-part']
  5. );
  6. }



Temat można zamknąć, problem rozwiązany.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.