namespace en use gebruik

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joakim Broden

Joakim Broden

18/08/2012 15:33:24
Quote Anchor link
Ik ben momenteel wat met namespace en use aan het experimenteren en krijg het tot nu toe allemaal werkend. Ik heb een cache class en boven in gebruik ik 'namespace Library\Cache;'. In de class Cache word gekeken of de directory \tmp\ bestaat, alleen als ik is_dir('\tmp\') doe krijg ik de melding dat hij niet bestaat. Zodra ik namespace weg haal bestaat de map wel. Logisch want zonder namespace gaat hij vanuit de root (index.php) aangezien daar de cache class geinclude word. En met namespace gaat hij vanuit de Cache directory. Hoe kan ik er voor zorgen dat hij met namespace de functies include, file_exists, is_dir gewoon werken zonder de paden met ..\ aan te passen.

PS mijn mappen opbouw is als volgt:
\Library\
\Library\Cache\
\Library\Cache\Cache.php
\tmp\
index.php
 
PHP hulp

PHP hulp

28/11/2024 17:54:22
 
Reshad F

Reshad F

18/08/2012 15:52:50
Quote Anchor link
Wil je een andere root hebben of ongeacht waar het bestandje staat kunnen openen? In dat geval zou ik in eerste instantie denken aan een loop functie die elk mapje afgaat.. Tevens vraag ik me af of dat niet een grote performance downgrade wordt..
 
Joakim Broden

Joakim Broden

18/08/2012 15:59:16
Quote Anchor link
Ik wil gewoon vanuit elke class (die dus gebruik maken van namespaces) de functies zoals include, fopen, file_exists, is_dir doen zonder een absolute path mee te geven.

Dus gewoon is_dir('tmp') in de class Cache kunnen uitvoeren en de melding krijgen dat de directory bestaat. Want hij bestaat ook, alleen door de namespace voert hij de is_dir niet uit in de root maar in Cache map
 
Reshad F

Reshad F

18/08/2012 16:07:36
Quote Anchor link
Kijk is naar realpath();
 
John Berg

John Berg

19/08/2012 15:08:55
Quote Anchor link
Kijk eens naar mijn artikel over de command line tester. Daar beschrijf ik een autoloader class, die precies het probleem oplost waar je nu tegenaan loopt.

Zie: http://www.ganymedes.be/clitester
 
Joakim Broden

Joakim Broden

20/08/2012 11:29:32
Quote Anchor link
Als ik jouwn autoloader begrijp loopt hij gewoon door alle namespaces heen om te kijken waar het bestand bestaat? Maar bij mij gaat het niet om autoloaden. Ik zal even proberen een voorbeeldje te geven.

Mappenstructuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
lib\Cache\Cache.php
tmp\
index.php

Ik heb de volgende class cache.phhp:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace lib\Cache;

class Cache {
    public function __construct($path) {
        if (is_dir($path)) {
            echo 'Path bestaat';
        }
else {
            echo 'Path bestaat niet';
        }
    }
}

?>

en index.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$cache
= new Cache('\tmp\\'); // Path bestaat niet
?>

Want in cache.php kijkt hij of de dir bestaat vanuit de namespace. Dus hij bestaat niet, als ik namespaces weghaal kijkt hij uit de root en dan bestaat de dir wel. Dus hoe kan ik er voor zorgen dat de functies zoals is_dir en file_exists van uit de root bekijkt en niet vanuit de namespace (liefst geen absolute paden)?
Gewijzigd op 20/08/2012 11:30:17 door Joakim Broden
 
Reshad F

Reshad F

20/08/2012 11:33:58
Quote Anchor link
Hertog heb gekeken naar realpath? Dat geeft je een relative path zoals jij wilt. Op php.net heb je zelfs nog mooie voorbeeldjes ook
 
John Berg

John Berg

20/08/2012 11:44:27
Quote Anchor link
@Hertog: Wat waar staat is altijd een geklooi. In de loop van de jaren heb ik diverse oplossingen en technieken geprobeerd. Uiteindelijk ben ik tot het volgende gekomen:

De eerste regel in mijn index.php (daar kom ik altijd binnen) is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
define( 'ROOT_PATH', dirname(__FILE__) ); // works also with cli


en als ik dan iets met het filesysteem wil doen dan doe ik dit
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$cache = new Cache(ROOT_PATH . '/tmp');


Blij wordt ik er niet van, maar ik heb geen enkele andere oplossing gevonden die goed werkt. $_SERVER["DOCUMENT_ROOT"] is deprecated en werkt bovendien niet in CLI

n.b. de autoloader heeft een mapping, waarin de namespace wordt bijgehouden en de folder waarin de namespace zich bevindt. Dus als je een classe wil creeeren bepaald de namespace in welke folder hij die classe gaat zoeken.
Gewijzigd op 20/08/2012 11:48:56 door John Berg
 
Joakim Broden

Joakim Broden

20/08/2012 12:13:00
Quote Anchor link
Oke dan ga ik nu eerst gebruik maken van define('root') geval. Wat me wel opvalt is hoe vaag php soms is zoals:

1 ) de functie glob gaat wel weer vanuit de root uit, ook al maak je gebruik van namespaces.
2 ) en de functies zoals file_exists en is_dir gaan weer van uit de namespace uit.

Waarom dan niet beide van uit de root, of beide van uit de namespace. Kan iemand mij de logica misschien vertellen waarom 1 van de root uit gaat en andere van uit de namespace?
Gewijzigd op 20/08/2012 12:14:05 door Joakim Broden
 
John Berg

John Berg

20/08/2012 12:24:45
Quote Anchor link
Hertog Jan op 20/08/2012 12:13:00:
Oke dan ga ik nu eerst gebruik maken van define('root') geval. Wat me wel opvalt is hoe vaag php soms is zoals:

1 ) de functie glob gaat wel weer vanuit de root uit, ook al maak je gebruik van namespaces.
2 ) en de functies zoals file_exists en is_dir gaan weer van uit de namespace uit.

Waarom dan niet beide van uit de root, of beide van uit de namespace. Kan iemand mij de logica misschien vertellen waarom 1 van de root uit gaat en andere van uit de namespace?


Namespaces hebben helemaal NIETS met het onderliggende file systeem te maken. Namespaces zijn er om classes op een logische wijze te groeperen, en ervoor te zorgen dat eventuele duplicate class names toch mogen, elk in een andere namespace.

Alle file functies kunnen werken met relatieve en absolute paden. Relatief is vaak onduidelijk omdat je dan steeds moet weten waar je in het filesysteem staat. Met getcwd() kun je dat opvragen, en vanaf dat punt kun je een relatieve pointer naar een andere folder of file gebruiken. Dus een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
glob(getcwd() . '../*.txt' )
is uiteraard valide omdat dit een absoluut path is. Maar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
glob('../*.txt' )
is ook valide en geeft ook alle txt bestanden in de folder bovenliggend aan de huidige directory.
Gewijzigd op 20/08/2012 12:37:27 door John Berg
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.