Autor Zpráva
Darker
Profil
Chtěl bych stvořit třídu s metodou OPEN která vrátí HANDLE, které půjde číst (a půjde do něj psát) funkcemi pro práci se soubory -
fread, fwrite, fclose atd.
Našel jsem tohle, to ale vyžaduje funkci PHP wrapperů, potřeboval bych handle vrátit přímo.
Tedy:
$pokus = new Neco();
$fp = $pokus->open();
echo fread($fp,50);
fclose($fp);
ShiraNai7
Profil
Tak si na to udělej vlastní obdobu wrapperu. Resource bude ta instance obsluhovat interně - tzn. že ji open() nevrátí rovnou ale vrátí objekt (např. třída Handle), který zprostředkuje požadované akce.
Darker
Profil
A jaké metody by ta třída handle měla mít, aby je fread brala?
ShiraNai7
Profil
Žádné. Nepoužíval bys fread, ale metodu read() na instanci třídy handle (pojmenovat ji můžeš jak chceš).


<?php
class Neco
{
    public function open($cesta, $mod) { return new Handle(fopen($cesta, $mod)); }
}

class Handle
{
    protected $res;
    public function __construct($res) { $this->res = $res; }
    public function read($len) { return fread($this->res, $len); }
}

$neco = new Neco;
$handle = $neco->open('soubor.txt', 'r');
echo $handle->read(50);
Darker
Profil
ShiraNai7:
Nepoužíval bys fread
Na používání fread mi záleželo. Napsání vlastní metody pro čtení jsem se chtěl vyhnout. Pak bych ani nemusel vracet třídu a mohl mít čtení a psaní přímo na objektu.


ShiraNai7:
Dík za tu ukázku, teď mi dochází, že asi není jasné, o co mi jde.
Snažím se v rámci třídy co dělám načíst data na různých místech v souboru/ve více souborech, nějak je rozparsovat a výsledek číst jako soubor. Nevidím jiné řešení než dočasný soubor, vůbec se mi ale nezamlouvá...
Alphard
Profil
[#1] Darker
Ten kód nefunguje? Nevidím v tom problém, metoda open() prostě musí vrátit ukazatel na otevřený soubor a ne true (jak uvádí odkázaná stránka).

a výsledek číst jako soubor
Tak jeden způsob je již uveden fopen("var://myvar", "r+");. Další možnost je vytvořit vlastní sestavu metod, jak uvádí [#4], pak by v pozadí vůbec nemusel být soubor...
Darker
Profil
Jenže já chci pravý opak [#4] - metoda vrátí handle k neexistujícímu souboru. Pokud není možné vytvořit /simulovat/ resource pro funkce pracující se soubory (bez wrapperů) nemá pro mě cenu dělat cokoliv jiného než metody read, write atd. přímo na objektu.
ShiraNai7
Profil
Vůbec nechápu o co se snažíš. Proč to musíš za každou cenu řešit přes resource?
Taky existují php://memory a php://temp
Darker
Profil
ShiraNai7:
Taky existují php://memory a php://temp

Darker:
Našel jsem tohle, to ale vyžaduje funkci PHP wrapperů
(bez wrapperů)


Tahle funkce je jen zřídkakdy dostupná na hostinzích, takže se mi její použití nehodí.
ShiraNai7
Profil
Darker:
Zřídkakdy? Jsou dostupné od PHP 5.1.0, které je staré už cca 7 let. Každý hosting, který to myslí alespoň trochu vážně je minimálně na verzi 5.3.x.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: