来自被调用文件的魔术常量 - 不是动作文件
Magic Constants from called file - not action file
我的 class:
中有这个功能
logMagic($mode)
{
# mode
# 1 = all, 2 = dir, 3 = file etc.
# this is wrapped inside a switch statement
# for eases sake here's the case 1: code
$log['dir'] = 'DIRECTORY: '. __DIR__;
$log['file'] = 'FILE: '. __FILE__;
$log['meth'] = 'METHOD: '. __METHOD__;
$log['fnc'] = 'FUNCTION: '. __FUNCTION__;
$log['ns'] = 'NAMESPACE: '. __NAMESPACE__;
$log['cl'] = 'CLASS: '. __CLASS__;
return $log;
}
这在 foo.php 文件中。然后我有一个 bar.php 文件,我在其中调用并初始化 class 以使用此函数:
require_once 'foo.php';
$logger = new \Logger('trey.log', 'var/logs');
$logger->logMagic($logger::ALL);
我的问题是,这将输出(在日志文件中):
DIRECTORY: /var/www/dir
FILE: /var/www/dir/foo.php
METHOD: Logger::logMagic
FUNCTION: logMagic
NAMESPACE:
CLASS: Logger
我的预期输出是 return
DIRECTORY: /var/www/dir
FILE: /var/www/dir/bar.php
METHOD:
FUNCTION:
NAMESPACE:
CLASS:
阅读 the docs 确实让我明白这是正常的。
有什么方法可以在 filea.php 中使用 fileb.php 中的魔术常量,而无需将参数传递给函数?
感谢 pos dupe link 我设法进行了一些挖掘以真正得到我想要的东西。 debug_backtrace()
似乎很好.. 通过每个函数调用追溯。例如
fileA.php
class Bar
{
public function foo()
{
echo '<pre>'. print_r(debug_backtrace(), 1) .'</pre>';
return 'hi';
}
}
fileB.php
require_once 'fileA.php';
$bar = new \Bar();
echo $bar->foo();
这输出:
Array
(
[0] => Array
(
[file] => /var/www/testing/test/fileB.php
[line] => 5
[function] => foo
[class] => Bar
[object] => Bar Object ()
[type] => ->
[args] => Array ()
)
)
hi
这在很大程度上是完美的。但是,这并不能保证结果,因为数组会随着堆栈的增加而增加。
E.g. FileC.php calls function in FileB.php which in turn, calls a function in
FileA.php
但是,我在使用该函数时注意到,最理想的是数组中的末尾元素。考虑到这一点,我设置了一些函数来模拟魔法常量的功能,而不使用任何魔法。
设置使用功能:
$trace = debug_backtrace();
$call = end($trace);
目录(__DIR__
):
# $trace = $call['file']
protected function getDir($trace)
{
$arr = explode('/', $trace);
$file = end($arr);
$directory = [];
$i = 0;
foreach ($arr as $data)
{
if ($data !== $file) {
$directory[] = isset($output) ? $output[$i - 1] . '/' . $data : $data;
$i++;
}
}
return 'DIRECTORY: '. implode('/', $directory);
}
文件 (__FILE__
)::
# $trace = $call['file']
protected function getFile($trace)
{
$arr = explode('/', $trace);
$file = end($arr);
return 'FILE: '. $file;
}
Function/Method (__FUNCTION__
|| __METHOD__
)::
# $trace = $call
protected function getFunction($trace)
{
$output = 'FUNCTION: '. $trace['function'] ."\n";
foreach ($trace['args'] as $key => $arguments)
{
foreach ($arguments as $k => $arg)
{
if (!is_array($arg)) {
$output .= 'ARGS ('. $k .'): '. $arg ."\n";
}
}
}
return $output;
}
命名空间(__NAMESPACE__
):
# $trace = $call['class']
protected function getNamespace($trace)
{
$arr = explode('\', $trace);
$class = end($arr);
$namespace = [];
$i = 0;
foreach ($arr as $data)
{
if ($data !== $class) {
$namespace[] = isset($output) ? $output[$i - 1] . '/' . $data : $data;
$i++;
}
}
return 'NAMESPACE: '. implode('\', $namespace);
}
Class (__CLASS__
):
# $trace = $call['class']
protected function logClass($trace)
{
if (strpos($trace, '\') !== false) {
$arr = explode('\', $trace);
$class = end($arr);
} else {
$class = $trace;
}
$return = 'CLASS: '. $class;
}
缺少魔术常量:
__LINE__
__TRAIT__
Line 可以访问(正如您从 print_r($call, 1)
中看到的那样),但我不在 need/interested。在我的使用中,Trait 与 __NAMESPACE__
大致相同,因此再次强调,它对为其创建函数不感兴趣。
备注:
这是我制作的 class 的一部分,它通过 public 可访问函数使用受保护的函数 - 请忽略 :)
这些函数可以被清理(例如,而不是 $trace = $call['file'],使用 $file 作为参数)
我的 class:
中有这个功能logMagic($mode)
{
# mode
# 1 = all, 2 = dir, 3 = file etc.
# this is wrapped inside a switch statement
# for eases sake here's the case 1: code
$log['dir'] = 'DIRECTORY: '. __DIR__;
$log['file'] = 'FILE: '. __FILE__;
$log['meth'] = 'METHOD: '. __METHOD__;
$log['fnc'] = 'FUNCTION: '. __FUNCTION__;
$log['ns'] = 'NAMESPACE: '. __NAMESPACE__;
$log['cl'] = 'CLASS: '. __CLASS__;
return $log;
}
这在 foo.php 文件中。然后我有一个 bar.php 文件,我在其中调用并初始化 class 以使用此函数:
require_once 'foo.php';
$logger = new \Logger('trey.log', 'var/logs');
$logger->logMagic($logger::ALL);
我的问题是,这将输出(在日志文件中):
DIRECTORY: /var/www/dir
FILE: /var/www/dir/foo.php
METHOD: Logger::logMagic
FUNCTION: logMagic
NAMESPACE:
CLASS: Logger
我的预期输出是 return
DIRECTORY: /var/www/dir
FILE: /var/www/dir/bar.php
METHOD:
FUNCTION:
NAMESPACE:
CLASS:
阅读 the docs 确实让我明白这是正常的。
有什么方法可以在 filea.php 中使用 fileb.php 中的魔术常量,而无需将参数传递给函数?
感谢 pos dupe link 我设法进行了一些挖掘以真正得到我想要的东西。 debug_backtrace()
似乎很好.. 通过每个函数调用追溯。例如
fileA.php
class Bar
{
public function foo()
{
echo '<pre>'. print_r(debug_backtrace(), 1) .'</pre>';
return 'hi';
}
}
fileB.php
require_once 'fileA.php';
$bar = new \Bar();
echo $bar->foo();
这输出:
Array
(
[0] => Array
(
[file] => /var/www/testing/test/fileB.php
[line] => 5
[function] => foo
[class] => Bar
[object] => Bar Object ()
[type] => ->
[args] => Array ()
)
)
hi
这在很大程度上是完美的。但是,这并不能保证结果,因为数组会随着堆栈的增加而增加。
E.g. FileC.php calls function in FileB.php which in turn, calls a function in FileA.php
但是,我在使用该函数时注意到,最理想的是数组中的末尾元素。考虑到这一点,我设置了一些函数来模拟魔法常量的功能,而不使用任何魔法。
设置使用功能:
$trace = debug_backtrace();
$call = end($trace);
目录(__DIR__
):
# $trace = $call['file']
protected function getDir($trace)
{
$arr = explode('/', $trace);
$file = end($arr);
$directory = [];
$i = 0;
foreach ($arr as $data)
{
if ($data !== $file) {
$directory[] = isset($output) ? $output[$i - 1] . '/' . $data : $data;
$i++;
}
}
return 'DIRECTORY: '. implode('/', $directory);
}
文件 (__FILE__
)::
# $trace = $call['file']
protected function getFile($trace)
{
$arr = explode('/', $trace);
$file = end($arr);
return 'FILE: '. $file;
}
Function/Method (__FUNCTION__
|| __METHOD__
)::
# $trace = $call
protected function getFunction($trace)
{
$output = 'FUNCTION: '. $trace['function'] ."\n";
foreach ($trace['args'] as $key => $arguments)
{
foreach ($arguments as $k => $arg)
{
if (!is_array($arg)) {
$output .= 'ARGS ('. $k .'): '. $arg ."\n";
}
}
}
return $output;
}
命名空间(__NAMESPACE__
):
# $trace = $call['class']
protected function getNamespace($trace)
{
$arr = explode('\', $trace);
$class = end($arr);
$namespace = [];
$i = 0;
foreach ($arr as $data)
{
if ($data !== $class) {
$namespace[] = isset($output) ? $output[$i - 1] . '/' . $data : $data;
$i++;
}
}
return 'NAMESPACE: '. implode('\', $namespace);
}
Class (__CLASS__
):
# $trace = $call['class']
protected function logClass($trace)
{
if (strpos($trace, '\') !== false) {
$arr = explode('\', $trace);
$class = end($arr);
} else {
$class = $trace;
}
$return = 'CLASS: '. $class;
}
缺少魔术常量:
__LINE__
__TRAIT__
Line 可以访问(正如您从 print_r($call, 1)
中看到的那样),但我不在 need/interested。在我的使用中,Trait 与 __NAMESPACE__
大致相同,因此再次强调,它对为其创建函数不感兴趣。
备注:
这是我制作的 class 的一部分,它通过 public 可访问函数使用受保护的函数 - 请忽略 :)
这些函数可以被清理(例如,而不是 $trace = $call['file'],使用 $file 作为参数)