Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odwołanie do methody rodzica
Forum PHP.pl > Forum > PHP
gcdreak
Witam!
Mam taką klase:
  1. <?php
  2. class MySPLFileObject extends SplFileObject
  3.    {
  4.        public $fp;
  5.        private $stats = array();
  6.        
  7.        function __construct($file){
  8.            $this->fp = new SplFileObject($file);
  9.            $this->stats = $this->fp->fstat();
  10.        }
  11.        
  12.        public function getFilename(){
  13.            return $this->fp->getFilename();
  14.        }
  15.        
  16.        public function getFileSize(){
  17.            return $this->stats['size'];
  18.        }
  19.        
  20.        public function getCreateTime(){
  21.            return date('Y-m-d G:i', $this->stats['ctime']);
  22.        }
  23.        
  24.        public function getAccessTime(){
  25.            return date('Y-m-d G:i', $this->stats['atime']);
  26.        }
  27.        
  28.        public function getModifyTime(){
  29.            return date('Y-m-d G:i', $this->stats['mtime']);
  30.        }
  31.    }
  32.    
  33.    
  34.    
  35.    $info = new MySPLFileObject('arrayObject.php');
  36.    
  37.    printf(
  38.        "|=== Plik <strong> %s </strong> =============| <br />".        
  39.        "||  <br />".
  40.        "|| ---> Rozmiar [B]: %s <br />".
  41.        "|| ---> Utworzony: %s <br />".
  42.        "|| ---> Urzywany: %s <br />".
  43.        "|| ---> Zmodyfikowany: %s <br />".
  44.        "||  <br />".
  45.        "|=====================================|",    
  46.        $info->getFilename(),
  47.        $info->getFileSize(),
  48.        $info->getCreateTime(),
  49.        $info->getAccessTime(),
  50.        $info->getModifyTime()
  51.    );
  52.    
  53.    echo $info->current();
  54. ?>


Kiedy wywołuje metody klasy SPLFileObject to pojawia mi się informacja o pobraniu pliku?
Mam w kodzie jakiś błąd?
batman
Oj namieszałeś, namieszałeś.
Jeśli rozszerzasz jakąś klasę, to nie przesłaniaj jej konstruktora. A jeśli to robisz, to nie twórz kolejnego obiektu, tylko wywołaj konstruktor rodzica:
  1. <?php
  2. parent::__construct($atrybuty_przyjmowane_przez_konstruktor_rodzica)
  3. ?>
Jak już to zrobisz to możesz wywalić s kodu metodę getFilename, ponieważ jest ona wstawiona w tym miejscu bez potrzeby - przecież występuj ona w klasie rodzica.
Resztę będziesz sam w stanie poprawić.
Crozin
Po co dziedziczysz po SplFileObject skoro w konstruktorze MySPL... tworzysz nową instancję tego obiektu?
Pr0100
  1. <?php
  2. /* ... */ extends SplFileObject /* ... */ new SplFileObject($file); /* ... */
  3. ?>


zdecyduj się na coś albo dziedziczysz (extends) albo tworzysz instancje (new)

Rozwiązanie #1 - dziedziczenie

  1. <?php
  2. function __construct($file){
  3.  parent::__construct($file);
  4.  $this->stats = $this->fstat();
  5. }
  6. ?>


i w całym skrypcie zamień $this->fp-> na $this->

Rozwiązanie #2 - new SplFileObject();

zamień
class MySPLFileObject extends SplFileObject
na
class MySPLFileObject

a zamiast

  1. <?php
  2. $info->current();
  3. ?>


daj

  1. <?php
  2. $info->fp->current();
  3. ?>


oczywiście możesz zrobić metode getCurrent() w klasie MySPLFileObject ale z tym chyba już sobie poradzisz smile.gif
gcdreak
Zrobiłem tak:
Kod
function __construct($file){
            parent::__construct($file);
            $this->stats = $this->fstat();
        }
        
        public function getFileSize(){
            return $this->stats['size'];
        }


I mam prośbę, aby ktoś mi wytłumaczył jedną istotną kwestie.
Chodzi o $this.
Kazaliście mi zmienić
Kod
return $this->fp->stats(...)
na
Kod
return $this->stats(...)

i w zwiażku z tym moje pytanie:
kiedy należy urzywać samego $this, a kiedy $this->parametr ?
Crozin
Podstawowe pytanie: czy rozumiesz o co chodzi w dziedziczeniu?
cojack
Tu nawet nie chodzi o pytanie, czy rozumie o co chodzi w dziedziczeniu, o nie rozumie o co chodzi w programowaniu obiektowym. (Nie twierdze że wszystkie rozumy pozjadałem).
gcdreak
Ciągle się ucze, ale zawsze mnie ciekawiła ta różnica.
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.