dziedziczenie i array pojedynczy zamiast pełnej tablicy

0

Cześć,
mam taki oto kod:

class Main {
  public $files = array();
  public function addFile($file, $type = 'jpg')
  {
    $files[$type] = $file;
    $this->files = array_merge($this->files, $files);
  }
}

class Front extends Main {
  public function content()
  {
    $this->addFile( 'xxx.jpg');
    $this->addFile( 'xxx2.jpg');
    $this->addFile( 'xxx3.jpg');
  }
  public function addFile($file)
  {
    parent::addFile($file);
  }
}

```

powiedzcie mi dlaczego w nie mam tablicy tylko pojedyncze elementy ?

Wynik:
```php
array ([0] => 'xxx.jpg')
array ([0] => 'xxx2.jpg')
array ([0] => 'xxx3.jpg')
```

Zamiast:
```php
array ([0] => 'xxx.jpg', [1] => 'xxx2.jpg', [2] => 'xxx3.jpg')
```
2
$files[$type] = $file;

Nie wiem dokładnie jak to działa w PHP, ale domyślam się, że jeśli indeks w tablicy to zawsze jpg ($type), to merge będzie zawsze nadpisywać element o tym samym indeksie.

Dodawaj elementy do tablicy taką funkcją: https://www.php.net/manual/en/function.array-push.php

  public function addFile($file)
  {
    array_push($files, $file);
  }
4

Po pierwsze, to zamiast

  {
    $files[$type] = $file;
    $this->files = array_merge($this->files, $files);
  }

Możesz

$this->files = array_merge($this->files, [$type => $file]);

Po drugie, tak, jeśli masz nie-numeryczne klucze, jak "jpg" to array_merge() nadpisze wartości, i zostanie Ci tylko jedna. Innymi słowy w array w PHP nie można mieć zduplikowanych kluczy. Jeśli chcesz, to najwyżej możesz pogrupować pliki po rozszerzeniu, ale w sumie to nie wiem czemu chcesz precyzować ten parametr, skoro możesz łatwo wyciągnąć rozszerzenie bezpośrednio ze ścieżki. No chyba że to nie rozszerzenie, tylko format, to wtedy spoko.

A po trzecie:

Nie używaj dziedziczenia

Zapomnij że istnieje takie słowo jak extends, robisz sobie krzywdę.

Jesli chcesz, to użyj kompozycji:

class Front
{
    /** @var Files */
    private $files;

    public function __construct()
    {
        $this->files = new Files();
    }

    public function content(): void
    {
        $this->files->addFile('xxx.jpg');
        $this->files->addFile('xxx2.jpg');
        $this->files->addFile('xxx3.jpg');
    }
}

class Files
{
    /** @var string[] */
    private $files;

    public function addFile(string $file, string $type = 'jpg'): void
    {
        $this->files = array_merge($this->files, [$file]);
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1