Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]OOP odwołanie do zmiennych innych metod
Forum PHP.pl > Forum > Przedszkole
gcdreak
Witam! Mam następujący kod:
  1. <?php
  2. class ftp_serw{
  3.                private $komp = "ftp.sewr.pl";
  4.                private $user = "anomous";
  5.                private $remote_file = "/sciezka/plik.zip";
  6.                
  7.                function __construct($komp){
  8.                    $conn_id = ftp_connect($komp) or die ("Nie można połączyć się z serwerem $komp.<br />");
  9.                        echo "Połączono z serwerem $komp.<br />";
  10.                    $login = ftp_login($conn_id) or die ("Nie można się zalogować jako $user.<br />");
  11.                        echo "Zalogowano jako $user";
  12.                }
  13.                function login($conn_id, $user = FALSE, $passw = FALSE){
  14.                    $login = ftp_login($conn_id) or die ("Nie można się zalogować jako $user.<br />");
  15.                         echo "Zalogowano jako $user";
  16.                }
  17.  
  18.            }
  19. ?>

W konstruktorze mam utworzoną właściwości $conn_id. Potrzebuje jej w metodzie login. Przedstawiony przezemnie kod jest niepoprawny.
Licze na Waszą pomoc.
PawelC
Przecież konstruktor jest automatycznie ładowany!

I tą klase co podałeś używasz tak, np:
  1. <?php
  2. $ftp=new ftp_serw();
  3.  
  4. // dalszy kod odpowiedzialny za wykonanie czegoś
  5. ?>

Jaki błąd ci wywala?

Sprawdziłem u siebie i skrypt działa cały czas, ale nic nie wyświetla.
Skąd masz tą klasę?

Tutaj jest cała masa o ftp http://pl.php.net/manual/pl/ref.ftp.php

Tutaj jest przykład połączenia i zalogowanie na ftp:
  1. <?php
  2.  
  3. $ftp_serwer            = "ftp.example.com";
  4. $ftp_nazwa_uzytkownika = "foo";
  5. $ftp_haslo             = "bar";
  6.  
  7. // nawiązanie połączenia lub zakończenie działania skryptu
  8. $conn_id = ftp_connect($ftp_serwer) or die("Nie można połączyć się z $ftp_serwer");
  9.  
  10. // próba logowania
  11. if (@ftp_login($conn_id, $ftp_nazwa_uzytkownika, $ftp_haslo)) {
  12.    echo "Połączony jako $ftp_nazwa_uzytkownika@$ftp_serwer\n";
  13. } else {
  14.    echo "Nie można zalogować się jako $ftp_nazwa_uzytkownika\n";
  15. }
  16.  
  17. // zamknięcie połączenia
  18. ftp_close($conn_id);
  19.  
  20. ?>

Prosto z manuala, co najważniejsze działa bez problemu bo sprawdzałem!
gcdreak
@ExPlOiT
nie zrozumiałeś mnie. Strukturalnie wiem, że jest prosto, utworzyć egzemplaż obiektu też umię.
Jeśli w jednej motodzie mam utworzoną zmienną i potrzebuję ją użyć w drugiej to jak mam to zrobić? Rozumiecie o co mi chodzi?
>> w funkcji ftp_login() muszę podać "conn_id" które zostało utworzone w osobnej metodzie(konstruktorze).

Ten przykład: http://pl.php.net/manual/pl/ref.ftp.php#44110 chyba już wszystko wyjaśnia.
Rano sprawdzę i napiszę jeśli będę miał jakiś problem.
PawelC
Zobacz jak to zrobiłem w swojej klasie:
  1. <?php
  2. public function __construct($host,$login,$haslo,$baza)
  3.            {
  4.                $this->mysqli=new mysqli($host,$login,$haslo,$baza);
  5.            }
  6.            
  7.            
  8.            
  9.            public function dane($query)
  10.            {
  11.                $result=$this->mysqli->query($this->query=$query);
  12.                while($data=$result->fetch_object()){
  13.                
  14.                    echo $data->kategoria;
  15.                }
  16. ?>

Ten kod obrazuje jak to zrobić, w konstruktorze nawiązałem połączenie, które używam w metodzie dane($query) jak sam widzisz, czyli $this->mysqli, a w Twoim wypadku jest to $conn_id. W Twoim wypadku w funkcji ftp_login(), wystarczy użyć $conn_id, np
  1. <?php
  2. public function ftp_login()
  3. {
  4. $plik="jaki.php";
  5. if($conn_id->ftp_delete($plik)) {
  6. echo "Plik $plik został usunięty\n";
  7. } else {
  8. echo "Nie powiodła się próba usunięcia pliku $plik\n";
  9. }
  10. }
  11. ?>
Zyx
ExPlOiT, dalej piszesz głupoty smile.gif. Przecież jak niby ma użyć zmiennej $conn_id jak ona nie będzie w tej funkcji istnieć?

gcdreak -> trochę bezsensownie korzystasz z możliwości, jakie daje Ci programowanie obiektowe. Do wewnętrznych zmiennych metody nigdy nie odwołasz się z zewnątrz, gdyż, jak wskazuje nazwa, są one wewnętrzne. Od tego, co musi być współdzielone między metodami, masz pola klasy i tam powinieneś przechowywać takie rzeczy. Co więcej, dotychczasowe pola, jakie utworzyłeś, także nie bardzo mają zastosowanie. Wpisałeś tam dane na sztywno, a uczyniłeś je prywatnymi, czyli de facto nie ma żadnej szansy, aby użytkownik klasy mógł tam wpisać własne ustawienia. Inna sprawa, że w ogóle później z tych pól nie korzystasz... smile.gif

Powinieneś zrobić tak:

1. Pola $komp, $user, $remoteFile zostawiasz, ale na wstępie dajesz im puste wartości (przy okazji mógłbyś wszystkiemu nadać jakieś jednolite nazewnictwo, tj. albo nazywasz wszystko po angielsku, albo wszystko po polsku).
2. Konstruktor pobiera parametry połączenia jako swoje argumenty i wpisuje je do tych pól.
3. Reszta klasy korzysta już wyłącznie z tych pól.
4. Ponieważ pola są prywatne, a czasem jednak przydaje się możliwość odczytania ich wartości, możesz dodać metody w stylu getServer() albo getUser() zwracające ich wartości. W ten sposób będzie je można odczytać, ale już nie będzie można ich zmodyfikować po nawiązaniu połączenia.
5. Tak samo z tym Twoim $conn_id. Do zwykłej zmiennej nie masz co tego zapisywać. Musisz utworzyć prywatne pole, wstawić wartość właśnie tam i później z niego korzystać. Tutaj już nie robisz metody do zwracania identyfikatora połączenia, gdyż jest to wewnętrzna sprawa Twojej klasy i reszta skryptu nie musi mieć do niego dostępu.
6. Ponadto nie rób obsługi wyświetlania błędów bezpośrednio w klasie, a tym bardziej nie rób tego przez die(). Jedyne, co to daje, to ogranicza poważnie zastosowanie klasy. Zamiast tego wykorzystaj wyjątek, a wtedy programista będzie mógł decydować, co zrobić w przypadku wystąpienia błędu, bo to właśnie on jest w stanie najlepiej ocenić, czy błąd taki jest dla niego na tyle krytyczny, że trzeba zatrzymać skrypt, czy nie, a jeśli tak, to miło byłoby, aby mógł on sobie sam to jakoś ładnie wyświetlić.

PS. ORTOGRAFIA!!! Primo: egzemplarz, secundo: umiem.
gcdreak
@Zyx
Dzięki za przydatne rady.
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.