Стрингово извикване

dakata__92

Super Moderator
Как да извикав функцията __DIR__ примерно ако я имам запаметена в стринг?
$var = "__DIR__";
Ако извикаме еcho $var; да изпише директорията. Пробвах с $$var; но не стана.
 
$var = __DIR__;
echo $var; ????

edit 1:

Или искаш да извикаш __DIR__ някъде другаде? Защо не извикаш __DIR__ тогава?

edit 2:

$var = function() { return __DIR__; };
$var();

но пак, защо не просто __DIR__ :)
 
djman каза:
$var = __DIR__;
echo $var; ????

Или искаш да извикаш __DIR__ някъде другаде? Защо не извикаш __DIR__ тогава?
Дълга и широка стринга идва от предварително зададени параметри заради това. Варянта ти не става просто си вади __DIR__.
 
Трябва да измислиш друг подход към това. DIR е магическа константа, която трудно би използвал в твоя вариант (без eval() - което е строго НЕпрепоръчително) :)

Ако се опитваш да направи някакъв вид loader на класове (видях предната тема за парсване на конфигурационни файлове), препоръчвам да разгледаш https://getcomposer.org/, който вероятно би ти решил проблема с зареждането на различни dependency-та :)
 
dakata__92 каза:
djman каза:
$var = __DIR__;
echo $var; ????

Или искаш да извикаш __DIR__ някъде другаде? Защо не извикаш __DIR__ тогава?
Дълга и широка стринга идва от предварително зададени параметри заради това. Варянта ти не става просто си вади __DIR__.

Няма как да вади __DIR__, освен ако не пишеш $var = "__DIR__" - забележи кавичките. -.- Кажи какво точно искаш и защо $var = __DIR__ (без кавички) не става.
 
djman каза:
dakata__92 каза:
djman каза:
$var = __DIR__;
echo $var; ????

Или искаш да извикаш __DIR__ някъде другаде? Защо не извикаш __DIR__ тогава?
Дълга и широка стринга идва от предварително зададени параметри заради това. Варянта ти не става просто си вади __DIR__.

Няма как да вади __DIR__, освен ако не пишеш $var = "__DIR__" - забележи кавичките. -.- Кажи какво точно искаш и защо $var = __DIR__ (без кавички) не става.

Така няма ли да запази __DIR__ състоянието в момента на дефиниране?
 
Колеги, ползвам xml.
HTML:
	<Command name="FRAMEWORK_SHORT_NAME" 	type="string" 	value="__DIR__" />

PHP:
$install = new SimpleXMLElement("c:/xampp/htdocs/dph/constants.xml", null, true);
//BLA BLA
foreach($command->attributes() as $k => $v){
$value = $v;
}
echo $value; // Тоест да ми изведе моментната директория и не ми се обяснява защо го правя така.
 
Еми освен да използваш well-known стойност (дори същата __DIR__) - да провериш, ако е тя (като стринг), презапиши с моментната директория? :)
 
Мисля, че по-доброто решение е да ползваш релативен път, а не PHP константа. Тъй като предполагам, ще имаш една точка на вход в апликацията...
Макар, че е доста объркващо, конста която името и е FRAMEWORK_NAME да ти държи папката....
 
index каза:
Мисля, че по-доброто решение е да ползваш релативен път, а не PHP константа. Тъй като предполагам, ще имаш една точка на вход в апликацията...
Макар, че е доста объркващо, конста която името и е FRAMEWORK_NAME да ти държи папката....
Това е просто за примера, не че тя ще държи това. Вероятно ще трябва да подам използването на определени константи като стринг да видя кои са добавени и ако са добавени да ги викам.
 
До колкото те разбирам ти трябва това.
Код:
<?php
$xml = '<Command name="FRAMEWORK_SHORT_NAME"    type="string"   value="return __DIR__;" />';
$install = simplexml_load_string($xml);
foreach($install->attributes() as $k => $v){
	if($k=='value'){
		$str = (string)$v;
		$f = create_function ('', $str);
		echo $f();
	}
}
 
Galli каза:
До колкото те разбирам ти трябва това.
Код:
<?php
$xml = '<Command name="FRAMEWORK_SHORT_NAME"    type="string"   value="return __DIR__;" />';
$install = simplexml_load_string($xml);
foreach($install->attributes() as $k => $v){
	if($k=='value'){
		$str = (string)$v;
		$f = create_function ('', $str);
		echo $f();
	}
}
Това е като eval. Ще трябва да сканирам стринга за определени функции и комбинации като dirname(__DIR__).__DIR__.DIRECTORY_SEPARATOR.blabla.php
 
Нещо такова дали ще ти свърши работа?

PHP:
$variables = [
   '__DIR__' => __DIR__,
   '__dateNow__' => date("Y-m-d H:i:s"),
   /* всички разрешени неща */
];

function get_value ($val) {
   if(array_key_exists($val))
       return $variables[$val];
   else
       return $val;
}

// ...

echo get_value($string_from_xml);
 
anonimen каза:
Нещо такова дали ще ти свърши работа?

PHP:
$variables = [
   '__DIR__' => __DIR__,
   '__dateNow__' => date("Y-m-d H:i:s"),
   /* всички разрешени неща */
];

function get_value ($val) {
   if(array_key_exists($val))
       return $variables[$val];
   else
       return $val;
}

// ...

echo get_value($string_from_xml);
Да това беше първото за което се сетих но проблема е че ако стринга който подавам е:
__DIR__.DIRECTORY_SEPARATOR. ще трябва да експлодирам и ако имам dirname(__DIR__) става дълга и широка.
 
Щом искаш толкова много функционалност - все някак ще ти трябва eval - освен ако не си напишеш собствен php interpreter... :D
 
anonimen каза:
Щом искаш толкова много функционалност - все някак ще ти трябва eval - освен ако не си напишеш собствен php interpreter... :D
Не просто релативен път преминат през realpath и връщане на някаква стойност.
HTML:
<Command>
			<name>FRAMEWORK_CONFIG_FOLDER</name>
			<type>string</type>
			<value></value>
			<path>ccf/settings/</path>
			<description>The location of the folder.</description>
		</Command>
		<Command>
			<name>FRAMEWORK_DEFEND_URL</name>
			<type>boolean</type>
			<value>true</value>
			<path></path>
			<description>Protection from illegal characters in the url.</description>
		</Command>
PHP:
$value = $command->value;
			if((array) $path = $command->path){
				$_path = realpath($path);
				$value = $_path ? strtolower(is_dir($_path) ? $_path.DIRECTORY_SEPARATOR : $_path) : $value;
			}
 

Горе