php dirname(__FILE__)与__FILE__常量的应用

 更新时间:2016年11月25日 16:47  点击:2158
在php中dirname()与__FILE__是我们的常量,本文章给大家详细介绍dirname()与__FILE__常量在使用过程中一些事项,大有兴趣的朋友可进入参考。

dirname() 函数

string dirname ( string $path )

给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。

在 Windows 中,斜线(/)和反斜线()都可以用作目录分隔符。在其它环境下是斜线(/)。


Example #1 dirname() 例子

例子

 代码如下 复制代码

<?php
echo dirname("c:/testweb/home.php");
echo dirname("/testweb/home.php");
?>

输出:

c:/testweb
/testweb

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名

dirname(__file__)
__FILE__ :被称为PHP魔术常量,返回当前执行PHP脚本的完整路径和文件名,包含一个绝对路径
1)dirname(__FILE__) 函数返回的是脚本所在在的路径。 更新网络
比如文件 b.php 包含如下内容:

 代码如下 复制代码

<?php
$basedir = dirname(__FILE__);
echo $basedir
//将在页面打印出一个这个文件所在绝对路径!
?>

我做的测试得到结果: E:websiteothertestcms

dirname(__FILE__) 一般会返回文件所的当前目录到系统根目录的一个目录结构。

不会返回当前的文件名称。

dirname(__FILE__) 也可能返回一个 . (当前目录)
[原因是 b.php 文件在 http.conf 或者 PHP 配置开发环境的默认WEB目录下.
比如 WEB_ROOT 为: "C:/root/www/".]

b.php文件路径为: "C:/root/www/b.php". 使用方法提示, 如果重复一次可以把目录往上提升一个层次:
比如:$d = dirname(dirname(__FILE__));
其实就是把一个目录给dirname()做参数了.因为dirname()返回最后的目录不带\\或者是/
所以重复使用的时候可以认为 dirname() 把最下层的目录当成文件名来处理了.照常返回
当前目录的上级目录.这样重复就得到了它的上一级的目录. 包含得到上一级目录的文件include(dirname(__FILE__).'/../filename.php');

2。如何将PHP文件和html文件结合使用

 代码如下 复制代码
if($reguser != ""){
echo"Submit Photo
";
echo"Log Out";
}else{
echo"Login";
}
?>
本文章给大家全面的介绍一下关于php中var_dump()函数用法详解,大家可参考参考。

var_dump()

void var_dump ( mixed expression [, mixed expression [, ...]] )

var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。


例1

 代码如下 复制代码

<?php
$a = "alsdflasdf;a";
$b = var_dump($a);
echo "<br>";
//var_dump($c);
$d=var_dump($c);
echo "<br>";
echo $a;
echo "<br>";
echo $b;
echo "<br>";
输出:
string(12) "alsdflasdf;a"
NULL
alsdflasdf;a

例2

1. var_dump() 示例

 代码如下 复制代码

<pre>
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_dump ($a);

/* 输出:
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

*/

$b = 3.1;
$c = TRUE;
var_dump($b,$c);

/* 输出:
float(3.1)
bool(true)

*/
?>
</pre> 

 
var_export和serialize做数组缓存


$str = serialize($arr);
这两种机制转换之后的字符串是不一样的,第一种是数组的原型模式,第二种是序列化后的形式。第一 种存入文件中的只要加上<?php ?>标签,就形式了一个可用的数组原型,对调用来说,不用转换,直接返回这个数组就可以,但第二种,则需要再用一次unserialize函数反序 列化一下。对于第种一说,就多了一步操作。下来我们用数据说话吧:

 

 代码如下 复制代码

<?
set_time_limit(50);
$a = array(1,2,3);
$b = array('a'=>1, 'b'=>2, 'c'=>3);
$c = array('a'=>array(1,2,3), 'b'=>array(4,5,6));


$time1 = microtime(true);


$times = 1000000; #10w


for($i=1; $i<=$times; $i++){
 $A = var_export($a, true);
}


$time2 = microtime(true);


for($i=1; $i<=$times; $i++){
 $B = var_export($b, true);
}


$time3 = microtime(true);


for($i=1; $i<=$times; $i++){
 $C = var_export($c, true);
}


$time4 = microtime(true);


for($i=1; $i<=$times; $i++){
 $X = serialize($a);
}


$time5 = microtime(true);


for($i=1; $i<=$times; $i++){
 $Y = serialize($b);
}


$time6 = microtime(true);


for($i=1; $i<=$times; $i++){
 $Z = serialize($c);
}


$time7 = microtime(true);


for($i=1; $i<=$times; $i++){
 $O = unserialize($X);
}


$time8 = microtime(true);


for($i=1; $i<=$times; $i++){
 $P = unserialize($Y);
}


$time9 = microtime(true);


for($i=1; $i<=$times; $i++){
 $Q = unserialize($Z);
}
$time10 = microtime(true);


$var_export_time['a'] = $time2 - $time1;
$var_export_time['b'] = $time3 - $time2;
$var_export_time['c'] = $time4 - $time3;


$serialize_time['a'] = $time5 - $time4;
$serialize_time['b'] = $time6 - $time5;
$serialize_time['c'] = $time7 - $time6;


$unserialize_time['a'] = $time8 - $time7;
$unserialize_time['b'] = $time9 - $time8;
$unserialize_time['c'] = $time10 - $time9;
print_r($var_export_time);
print_r($serialize_time);
print_r($unserialize_time);
?>
output:
Array(    [a] => 3.3401498794556    [b] => 5.1394801139832    [c] => 8.8483898639679)Array(    [a] => 1.6063709259033    [b] => 1.7033960819244    [c] => 3.4534389972687)Array(    [a] => 1.6037359237671    [b] => 1.817803144455    [c] => 3.7992968559265)

由上面数据说明:
var_export函数性能比serialize函数性能差一倍,而 unserialize时间也需要和serialize差不多的时间,serialize加上unserialize时间,和用var_export时间 差不多。

在php中spl_autoload_register与__autoload方法是php5才有的,下面我来给大家介绍这两个魔术函数的使用方法,大家可进入了解了解。

spl_autoload_register()函数应该是主流框架使用最多的也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简化了类的调用与加载,提高了工作的效率。

支持版本:PHP 5 >= 5.1.2

至于效率问题。php手册上有如此之话:

bool spl_autoload_register ([ callback $autoload_function ] )

将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。

spl_autoload_register
(PHP 5 >= 5.1.2)
spl_autoload_register — 注册__autoload()函数
说明
bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或
spl_autoload_call()。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数
spl_autoload()。
返回值
如果成功则返回 TRUE,失败则返回 FALSE。
注:SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。 SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数 spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

 代码如下 复制代码

<?php
class autoload
{
  public static function load( $class name )
  {
    $filename = $classname.".class.php";
    if (file_exists($filename )) {
      require_once $filename ;
    }
  }
}
 
function __autoload( $class name )
{
    // 这个是默认的 autoload 方法
    $filename = $classname.".class.php";
    if (file_exists($filename )) {
      require_once $filename ;
    }
}
 
// 注册一个 autoloader
spl_autoload_register( 'autoload::load' );
spl_autoload_register( '__autoload' );
 // 注:下面的类看上去没有定义,但其实系统根据sql_autoload_register提供的路径会自动去搜索
//foo.class.php文件,如果没找到才报错。
$foo = new foo();
$foo ->bar();
?>

在补充下:

__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法
* 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list

spl_autoload_register( '__autoload' );

此外我们还可以使用我们自定义的加载方法:

第一种函数式:

 代码如下 复制代码

function my_own_loader($classname)
{
    $class_file = strtolower($classname).".php";
    if (file_exists($class_file)){
        require_once($class_file);
    }
}
 
spl_autoload_register("my_own_loader");
 
$a = new A();

第二种类式:

 代码如下 复制代码

class Loader
{
    public static function my_own_loader($classname)
    {
        $class_file = strtolower($classname).".php";
        if (file_exists($class_file)){
            require_once($class_file);
        }
    }
}
 
// 通过数组的形式传递类和方法的名称
spl_autoload_register(array("Loader","my_own_loader"));
$a = new A();

实例:CI框架实现类加载的同时,其对应的model也生成。

 代码如下 复制代码

static public function myAutoload($class){
  if(file_exists(APPPATH.'models'.DIRECATORY_SEPARATOR.$class.'.php')){
     require_once APPPATH.'models'.DIRECATORY_SEPARATOR.$class.'.php';
  }
}
/**
* 注册加载器
*/
static public function autoload(){
   spl_autoload_register(array(__CLASS__, 'myAutoload'));
   if(class_exists('__autoload')){
      spl_autoload_register('__autoload');
   }
}
MY_Controller::autoload();


当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。

此外,假如我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。它的函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )

我们继续改写上面那个例子:

 代码如下 复制代码

view plaincopy to clipboardprint?
<?php  
function loader($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  

spl_autoload_register('loader');  

$a = new A();

<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}

spl_autoload_register('loader');

$a = new A();

这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:

 代码如下 复制代码

view plaincopy to clipboardprint?
<?php  
class Loader  
{  
public static function loadClass($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  
}  

spl_autoload_register(array('Loader', 'loadClass'));  

$a = new A();

在php中字符替换函数有几个如有:str_replace、substr_replace、preg_replace、preg_split、str_split等函数,下面我来给大家总结介绍介绍。

一、str_replace(find,replace,string,count)

作用:str_replace() 函数使用一个字符串替换字符串中的另一些字符。

参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

在本例中,我们将演示带有数组和 count 变量的 str_replace() 函数:

 代码如下 复制代码

<?php
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "Replacements: $i";
?>输出:

Array
(
[0] => blue
[1] => pink
[2] => green
[3] => yellow
)
Replacements: 1

补充:count如果被指定,它的值将被设置为替换发生的次数。

二、substr_replace(string,replacement,start,length)

作用:substr_replace() 函数把字符串的一部分替换为另一个字符串。

参数 描述
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
start 必需。规定在字符串的何处开始替换。

■正数 - 在第 start 个偏移量开始替换
■负数 - 在从字符串结尾的第 start 个偏移量开始替换
■0 - 在字符串中的第一个字符处开始替换
 
charlist 可选。规定要替换多少个字符。

■正数 - 被替换的字符串长度
■负数 - 从字符串末端开始的被替换字符数
■0 - 插入而非替换
 

例子

 代码如下 复制代码

<?php
echo substr_replace("Hello world","earth",6);
?>

输出:

Hello earth


三、preg_replace ( pattern , replacement , subject,limit = -1 ,$count  )

作用:执行一个正则表达式的搜索和替换

参数 描述
pattern 必需。需要搜索的模式。
replacement 必需。用于替换的字符串或数组。
subject 必需。需要替换的字符串或数组。
limit 替换的次数。-1为无限
count 完成替换的次数,变量

Example #1 使用后向引用紧跟数值原文

 代码如下 复制代码
<?php
$string = 'April 15, 2003';
$pattern = '/(w+) (d+), (d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
?>

 以上例程会输出:

April1,2003


Example #2 preg_replace()中使用基于索引的数组

 代码如下 复制代码
<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>

以上例程会输出:

The bear black slow jumped over the lazy dog.

四、preg_split ( pattern , subject,limit = -1 ,flag  )

作用:通过正则表达式分割字符串

参数 描述
pattern 必需。需要搜索的模式。
replacement 必需。用于替换的字符串或数组。
subject 必需。需要替换的字符串。
limit 被分割的字符串最多limit。
flag 模式

例 1672. preg_split() 例子:取得搜索字符串的成分

 代码如下 复制代码

<?php
// split the phrase by any number of commas or space characters,
// which include " ", r, t, n and f
$keywords = preg_split ("/[s,]+/", "hypertext language, programming");
?>

例 1673. 将字符串分割成字符

 代码如下 复制代码

<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

例 1674. 将字符串分割为匹配项及其偏移量

 代码如下 复制代码

<?php
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>

本例将输出:

Array
(
[0] => Array
(
[0] => hypertext
[1] => 0
)

[1] => Array
(
[0] => language
[1] => 10
)

[2] => Array
(
[0] => programming
[1] => 19
)

)

五、str_split ( subject,length)

作用:将字符串分割成数组

参数 描述
subject 字符串。
length 每一段的长度。

例子 1

 代码如下 复制代码
<?php
print_r(str_split("Hello"));
?>

输出:

Array
(
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
)

例子 2

 代码如下 复制代码
<?php
print_r(str_split("Hello",3));
?>

输出:

Array
(
[0] => Hel
[1] => lo
)

本文章来给大家介绍PHP常用字符串正则替换及剖分函数比较,在php字符串正则替换大概有:str_replace、str_ireplace、substr_replace、preg_replace、preg_match、preg_match_all、preg_quote、preg_split、ereg_replace、eregi_replace、preg_replace、str_split函数,下面我来给大家介绍。

正则函数关系暧昧所以都放到一起比较一下,方便参考。

名称 支持正则 特点 备注
str_replace X 字符串替换函数,大小写敏感  
str_ireplace X 字符串替换函数,大小写不敏感,支持数组式批量替换 感谢网友franci,提醒添加
substr_replace X 部分替换字符串函数,可以指定位置index  
       
preg_replace Y 指定匹配模式进行替换,支持子串引用  优先使用
ereg_replace Y 指定匹配模式进行替换,大小写敏感,支持子串引用  
eregi_replace Y 指定匹配模式进行替换,大小写不敏感,支持子串引用  
       
ereg Y 指定模式全文匹配,可以用来匹配判断,或返回匹配数组  
preg_match Y 指定模式匹配一次退出,可以用来是否匹配判断,或使用返回的匹配数组  优先使用
preg_match_all Y 指定模式全文匹配,一般用来使用返回的匹配数组  优先使用
       
preg_split Y 指定匹配模式下正则剖分,如果能用最好还是使用explode或str_split  
str_split X 指定长度剖分字符串,默认单个字符剖分成数组  
explode X 可以指定单个或多个字符剖分字符串,成功则返回数组,例如12345按照34剖分则返回12和5  
       
 preg_quote  -  转义正则表达式字符,意思就是为特殊字符加上反斜线,正则表达式的特殊字符包括:. + * ? [ ^ ] $ ( ) { } = ! < > | : -  
       

补充说明:

1、在PHP中有两套正则表达式函数库,功能非常相似:

一套是POSIX(Portable Operating System Interface of Unix )库提供的,函数以ereg_前缀命名,POSIX正则函数库目前已经不再推荐使用

一套是PCRE(Perl Compatible Regular Expression)库提供的,函数以preg_前缀命名,推荐大家优先使用。在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/^w+$/”样式。

2、PHP正则表达式作用:匹配提取、匹配替换。

[!--infotagslink--]

相关文章

  • linux中PHP dirname(__FILE__)路径问题解决

    在php 中dirname() 函数返回路径中的目录部分,__FILE__而当前运行文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。这是一个魔法变量(预定义常量),在...2016-11-25
  • JS跨浏览器解析XML应用过程详解

    这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
  • C++变量,常量,数组和字符串详解

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • vivo X9如何查出后台偷跑流量应用?vivo X9查出后台偷跑流量应用的方法

    vivo X9如何查看后台流量偷跑的情况?小编教你轻松查到!还不了解的小伙伴快来看看吧! 1)打开手机自带的【i管家】应用,打开后点击【流量监控】选项。(如下图) 2)接着选...2016-12-31
  • PHP云存储Redis的应用场景与Redis实现排行榜功能

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本文我们来讲解Redis的应用场景实例。 C...2016-11-25
  • PHP explode()函数的几个应用和implode()函数有什么区别

    explode()函数介绍explode() 函数可以把字符串分割为数组。语法:explode(separator,string,limit)。 参数 描述 separator 必需。规定在哪里分割字符串。 string...2015-11-08
  • PHP Libevent扩展安装配置及简单应用

    Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,下文我们就一起来看PHP Libevent扩展安装...2016-11-25
  • php中echo <<< 的应用

    <? $a="变量的值将被带入"; echo <<< help <pre> php中echo <<< 的应用 虽然echo "...";可以断行,但若其中如出现",则仍需做转义 处理。需写做: echo " ...2016-11-25
  • C#中变量、常量、枚举、预处理器指令知多少

    这篇文章主要介绍了c#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量,需要的朋友可以参考一下...2020-06-25
  • PHP-GTK 介绍及其应用

    1. PHP-GTK介绍 1.1 PHP-GTK PHP-GTK是PHP的延伸模组,它可以让程式设计师写出在客户端执行的、且独立的GUI的程式。这个模组不允许在浏览器上显视GTK+的程式,它一开始就...2016-11-25
  • Vue中keep-alive的两种应用方式

    这篇文章主要介绍了Vue中keep-alive的两种应用方式,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-15
  • css中Float属性深入剖析与应用

    这篇文章介绍了css中的float属性的应用和理解,让设置的标签产生浮动效果。希望能帮助到有需要的同学。 一、Float的特性 1. 应用于文字围绕图片 2. 创建一个块级框...2017-01-22
  • ajax简单与ajax+php实例应用(1/4)

    [ajax介绍]   ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25
  • php ob_start() ob_end_flush()缓存技术简单应用

    本文章介绍了一个简单的关于php入门篇-缓存技术简单应用,有需要的朋友可以看看哦,这里是利用了ob_start(); ob_end_flush(); 来实例的。 代码如下 复制...2016-11-25
  • R语言常量知识点总结

    在本篇文章里小编给大家整理了一篇关于R语言常量知识点总结内容,有兴趣的朋友们可以学习分享下。...2021-05-06
  • Android 应用包 apk 的内部结构详解

    Android应用程序会通过一个工具将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。 Android 是Google开发的基于Linux平台的开源手机操...2016-09-20
  • C++常量指针,指针常量,指向常量的常指针详解

    刚接触到指针时,关于C++常量指针,指针常量,指向常量的常指针容易混淆,所以整理下,希望能够帮助自己也帮助到大家...2021-10-18
  • 时隔数日苹果又发布了iOS 10.2 Beta3:TV应用来了

    网易科技讯 11月14日消息,据美国媒体报道,当日苹果开始推出iOS 10.2 Beta3公开测试版,距离发布iOS 10.2 Beta2发布后仅数日。此外,苹果还推出数周前发布MacBook Pro时提到的TV应用,现在该应用有了Up Next功能。...2016-11-22
  • 基于数据类型转换(装箱与拆箱)与常量详解

    下面小编就为大家分享一篇基于数据类型转换(装箱与拆箱)与常量详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • Node.js中 __dirname 的使用介绍

    这篇文章主要给大家介绍了关于Node.js中 __dirname使用的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。...2017-06-24