Een vraagje... ik ben even vergeten hoe het nu ook alweer zat.
Normaal ziet een pad er zo uit:
/pad/foo
Nu meen ik dat het soms zo kan zijn dat soms de slashes andersom staan:
\pad\foo
En dat dat dan automatisch wordt gecorrigeerd naar /pad/foo.
Ik heb even getest door een directory te verwijderen. Met forward slashes lukt dat gewoon, maar met backward slashes werkt het niet.
Dus ik ben even benieuwd of iemand kan uitleggen hoe dat ook alweer zat. Is een pad met backward slashes altijd ongeldig, of kan dit op sommige systemen ook geldig zijn?
>> Zoals ik al zei: Je moet data normalizen voordat je ze gaat gebruiken in je code. Dus maak een functie die alle backward slashes omzet naar forward slashes en die de trailing slash weghaalt. Ga dan pas werken met de slashes
Ah ja, dat had je inderdaad gezegd. Maar stel nu dat mijn systeem ooit op Windows terecht komt... dan heb ik toch juist weer die backward slashes nodig? Of kan ik dan beter alle forward en backward slashes vervangen door de directory separator?
En als ik de slashes heb vervangen, hoe haal ik dan een eventuele trailing slash weg? Is dit de juiste manier?
Ozzie, gebruik in je code altijd maar 1 manier: of backslashes of forward slashes, dat moet je nu beslissen.
Zoals ik net zei kan windows perfect omgaan met forward slashes, hij geeft alleen altijd iets terug met backslashes. En mocht je dan perse de behoefte hebben om backslashes te gebruiken heb je ook weer een denormalizer, die het weer terug zet naar iets wat de OS aankan.
Even een snelle abstract van je code:
<?php
class Path
{
private $path;
public function __construct($path)
{
$this->path = $path;
}
public static function parse($path)
{
return new self(rtrim(str_replace('\\', '/', $path)), '/');
}
public function getUnixPath()
{
return $this->path;
}
public function getWindowsPath()
{
return str_replace('/', '\\', $this->path);
}
public function getOsPath()
{
return '/' === DIRECTORY_SEPARATOR ? $this->path : str_replace('/', DIRECTORY_SEPARATOR, $this->path);
}
public function __toString()
{
return $this->getOsPath();
}
}
// Gebruik
$cwd = Path::parse(getcwd());
$contents = file_get_contents($cwd.'/hello.txt');
Ik wil zelf altijd de forward slash gebruiken. Ik zit nu op een Unix OS en verwacht dat dat ook zo blijft. Maar als ik jou goed begrijp, stel dat ik ooit m'n systeem op Windows zou zetten, dan krijg ik dus paden met backslashes terug. En deze backslashes moet ik dan normalizen naar forward slashes. Zeg ik het zo goed? Heb ik het "probleem" dan getackled?
>> Nooit trailingslashea gebruiken naar mijn mening.
Oké. Maar dat betekent dus dat als je bijv. een $image_path hebt, je altijd een slash zou moeten toevoegen: echo $image_path . '/image.jpg'; Zo zou jij het dan dus doen?
Is dat de "algemene" manier? Ik kom namelijk ook wel eens dit tegen $image_path . 'image.jpg' waarbij de trailing slash dus onderdeel is van het path. Ook dit is natuurlijk weer een kwestie van persoonlijke voorkeur, maar ik ben wel heel benieuwd wat nu het meest gebruikelijk is. Maar volgens jou dus zonder trailing slash?
Je moet ervoor zorgen dat je de controle hebt, dus in die lijkt het mij het beste om trailing en preceding slashes weg te halen (bij user input), zodat je altijd de juiste paden krijgt.
Even een beetje offtopic:
Als ik bv imagejpeg($foto, $path) met backslashes gebruik in $path wordt in Windows 8, de foto niet opgeslagen. reden te meer om forward slashes te gebruiken ;-)
>> Je moet ervoor zorgen dat je de controle hebt, dus in die lijkt het mij het beste om trailing en preceding slashes weg te halen (bij user input), zodat je altijd de juiste paden krijgt.
Maar mijn vraag is meer in algemene zin, hoe een directory path eruit hoort te zien. Hoot de trailing slash daar wel of niet te staan. Dus is het rmdir('foo') of rmdir('foo/') ?
>> ... reden te meer om forward slashes te gebruiken ;-)
Ja, inderdaad... Ik was sowieso van plan om alleen forward slashes te gebruiken.
Volgens mij werkt het allebei, maar zonder de trailing slash zeker. Dus is de keuze eenvoudig.
Ik zelf gebruik zelf overigens met dat soort dingen alleen volledige systeem paden.