php面相对象的魔术方法中文说明与例子

 更新时间:2016年11月25日 15:37  点击:2197
在 PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup() 等,被称为"魔术方法"(Magic methods),

集合涵义

在PHP中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。如果希望PHP调用这些魔术方法,首先必须的类中定义,否则PHP不会执行未创建的魔术方法。[1]
  
注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。


魔术方法中文说明

*PHP面向对象有哪些魔术方法,每个魔术方法如何如何,请写个测试类并运行
*
*__construct($argv1,$argv2,...)
*功能:类的构造方法,作用就是初始化对象
*参数:任意多个,任意类型
*返回值:无
*__destruct()
*功能:类的析构方法,对象被销毁时被调用的,作用是释放内存
*参数:无
*返回值:无
*__get($name)
*功能:当程序试图调用一个未定义或者不可见的成员变量的时候就会自动调用该方法,这个时候程序试图调用*的成员变量的返回值是该方法的返回值;
*参数:$name为试图调用的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:类型(不确定)注意该方法可以设置成私有的(构造方法不要设置成私有的)。
*__set($name,$value)魔术方法
*功能:当程序试图给一个未定义或者不可见的成员变量赋值的时候就会自动调用该方法;
*参数:$name,$value分别表示试图赋值的成员变量名称和成员变量的值,这两个参数的传递是PHP自动完成的;
*返回值:这个方法不会返回值 注意该方法可以设置成私有的(构造方法不要设置成私有的)。
*__isset($name)
*功能:当用isset($name)检测一个私有的成员变量的时候就会自动调用该方法,这个时候isset($name)的返回值就
*为该方法的返回值经过转化的布尔值(<除“0”>非空的字符串,非零,true,有单元的数组将会转化为true;0,"0",空*字符串,NULL,没有单元的数组将会转化为false);
*参数:$name为试图检测的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:类型(不确定)注意该方法可以设置成私有的(构造方法不要设置成私有的),当用isset()函数检测的是
*公有的成员变量的时候可以直接检测,如果没有__isset()方法而直接检测私有成员会得到不准确的结果即isset()
*会始终返回false;
*__unset($name)
*功能:当用unset($name)撤销一个私有的成员变量的时候就会自动调用该方法;
*参数:$name为试图撤销的成员变量的名称,这个参数的传递是PHP自动完成的;
*返回值:不能返回值,强制返回值将会出错,当用unset()函数撤销的是公有
*的成员变量的时候可以直接撤销,如果没有__unset()方法而直接撤销私有成员不会成功;
*__toString()
*功能:当程度试图输出一个对象类型的变量的时候PHP会自动调用该方法;
*参数:没有参数,如果有会提示出错;
*返回值:字符型(该方法必须通过return返回一个字符串);
*__clone()
*功能:在用clone关键字克隆一个对象的时候PHP会自动调用这个方法,是为了给克隆出来的对象增添自己的属
*性和方法;
*参数:不用传递参数;
*返回值:不用返回值;
*__call($name,$argument)
*功能:当程序试图调用一个不存在的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给*$argument;
*返回值:不用返回值;
*__sleep()
功能:使用serialize()函数时,如果实例化的对象中包含__sleep()方法,则会先执行__sleep()方法,该方法可以清除
*对象并返回该对象中所有变量的数组。使用__sleep()方法的目的是关闭对象可能具有的数据库连接等类似的
*善后工作
*参数:无需要传递参数
*返回值:数组类型(Array)该对象中所有变量的数组
*__wakeup()
*功能:使用unserialize()函数重新还原一个被serialize()函数序列化的对象,__wakeup()方法则是恢复序列化中可能
*丢失的数据库连接及相关工作
*参数:无需要传递参数
*返回值:----------------------------
*__set_state($arr)
*功能:可以通过var_export()来访问类的静态方法__set_state(),该方法必须是静态的且必须返回一个对象
*参数:$arr为一个数组
*返回值:为一个对象
*
*__autoload($class_name)
*功能:在指定的路径下自动查找并导入实例化需要使用的类
*参数:$class_name为类名
*返回值:*__callStatic($name,$argument)
*功能:当程序试图在静态方法中调用一个未定义或者不可见的成员方法的时候会自动调用该方法;
*参数:PHP将自动将调用的不存在的方法名传递给$name,不存在的方法中的参数整合为一个数组传递给$argument;
*返回值:不用返回值;*注意:PHP5.3以上的版本支持该魔术方法
*注意:__classStatic()方法必须被申明为public并且为static,否则会产生一个warning错误
*__invoke($x,$y,...)
*功能:当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
*参数:以函数调用方法调用一个对象时传递的任意多个参数
*返回值:不确定*注意:PHP5.3以上的版本支持该魔术方法
**/


魔术方法例子

 

 代码如下 复制代码

class XuDianYang{
 public $sex;
 public $age;
 private $girlfriend='xx';
 public function __construct($sex,$age){
  $this->sex=$sex;
  $this->age=$age;
 }
 public function __get($name){
  echo __class__."::".$name."不存在或者不可见";
 }
 public function __set($name,$value){
  echo __class__."::".$name."由于不在在或者不可见,赋值失败";
 }
 public function __isset($name){
  if(isset($this->$name)){
   echo 1;
  }else{
   echo 0;
  }
 }
 public function __unset($name){
  unset($this->$name);
 }
 public function __toString(){
  return __class__;
 }
 public function __clone(){
  $this->sex='女';
 }
 public function __call($name,$argument){
  echo "方法".__class__."::".$name."不存在";
 }
 public function __sleep(){
  echo "I'm sleeping";
  foreach($this as $key=>$value){
   $arr[]=$key;
  }
  return $arr;
 }
 public function __wakeup(){
  echo "I wake up";
 }
 public function __set_state($arr){
  $obj=new CheShi();
  $obj->var1=$arr['sex'];
  $obj->var2=$arr['age'];
  return $obj;
 }
}
function __autoload($name){
 $class_path="./";
 include_once($class_path.$name.".class.php");
}
$xudianyang=new XuDianYang("男",21);
echo "<br/>";
//正常访问sex属性
echo $xudianyang->sex;
echo "<br/>";
//由于不存在weight属性,将自动调用__get()方法
echo $xudianyang->weight;
echo "<br/>";
//由于不可见(即私有),将自动调用__get()方法
$xudianyang->girlfriend;
echo "<br/>";
//由于不存在,赋值失败,自动调用__set()方法
$xudianyang->shengao="172cm";
echo "<br/>";
//检测sex属性是否存在,由于sex公有直接检测
var_dump(isset($xudianyang->sex));
echo "<br/>";
//检测girlfriend是否存在,由于girlfriend私有,所以自动调用__isset()方法
isset($xudianyang->girlfriend);
echo "<br/>";
//撤消girlfriend,由于girlfriend私有,所以自动调用__unset()方法
//unset($xudianyang->girlfriend);
isset($xudianyang->girlfriend);
echo "<br/>";
//直接输出一个对象,自动调用__toString()方法
echo $xudianyang;
echo "<br/>";
$xu=clone $xudianyang;
echo $xu->sex;
echo "<br/>";
//由于调用不存在的方法,自动调用__call()方法
$xudianyang->walk();
echo "<br/>";
//序列化对象,自动调用__sleep()方法
$a=serialize($xudianyang);
echo "<br/>";
echo "序列化的结果为:".$a;
//反序列化对象,自动调用__wakeup()方法
echo "<br/>";
$b=unserialize($a);
//反序列化的结果
echo $b->sex;
echo "<br/>";
eval('$c='.var_export($xudianyang,true).";");
echo $c->var1;
?>

CheShi.class.php

<?php
class CheShi{
 public $var1;
 public $var2;
}
?>

PDO(PHP数据对象) 是一个轻量级的、具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法使用,下面我们一起来了解一下PHP PDO配置及使用方法

PDO(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
我是配置在windows下做开发用的。
PDO的目标提供一种轻型、清晰、方便的 API统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
通过 PHP 脚本提供可选的较大程度的抽象/兼容性。
PDO的特点:性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
能力。
PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
简单。
PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
运行时可扩展。

PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。■

安装PDO

版本要求:

php5.1以及以后版本的程序包里已经带了;
php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;
手册上说5.0之前的版本不能运行PDO扩展。

配置(Windows):

修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)

extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。

往下还有

;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

找到extension=php_pdo.dll 和 extension=php_pdo_mysql.dll ,去掉前面“;”的注释,修改后的两行配置内容如下:

extension=php_pdo.dll
extension=php_pdo_mysql.dll

各各扩展所对应的数据库是:

Driver name Supported databases
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird/Interbase 6
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x/4.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2

你要使用哪种数据库,只要把相应的扩展前的注释符号”;”去掉就可以了。


配置(Linux):

编译PHP时加上:

--enable-pdo --with-pdo-sqlite --with-pdo-mysql=/usr/local/mysql/bin/mysql_config


重启apache或iis,搞一个测试页,里面就phpinfo函数,可查看PDO模块是否开启。


使用PDO(Mysql 数据库举例)

数据库的连接:

我们通过下面的例子来分析PDO连接数据库,建立一个 PDO_config.php 文件,使用的时候直接 include 一下:
<?php
//数据库类型 Oracle 用 OCI ,对于开发者来说,使用不同的数据库只要改这个:
$dbms   = 'mysql';
$host   = 'localhost';
//数据库主机名
$dbName = 'test_test_test';
//使用的数据库
$user   = 'root';
//数据库连接用户名
$pass   = ' ';
//对应的密码
$dsn    = "$dbms:host=$host; dbname=$dbName";

try{

//初始化一个PDO对象,就是创建了数据库连接对象 $dbh:
 $dbh = new PDO($dsn, $user, $pass);
//echo "连接成功<br/>"; /*你还可以进行一次搜索操作
 foreach($dbh->query('SELECT * from FOO')as$row){
  print_r($row);
  //你可以用 echo($GLOBAL); 来看到这些值

 }
 $dbh = null;
}catch(PDOException$e){
 die("Error!: ".$e->getMessage()."<br/>");
}
/*
默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true));
*/
$db = new PDO($dsn, $user, $pass);
//创建数据库连接对象 $db
?>

数据库查询:

上面我们已经进行了一次查询,我们还可以使用如下的查询:
<?php
include("./PDO_config.php");

$db -> setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);

//设置属性
$rs = $db->query("SELECT * FROM yourtable");
$rs -> setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs -> fetchAll();

//获取所有记录集到一个变量中
print_r($result_arr);

?>

以上因为用到setAttribute()方法,放上那两个参数,把字段名强制转换成大写。

下面列出多有PDO::setAttribute()的参数:

PDO::ATTR_CASE:
强制列名变成一种格式,详细如下(第二个参数):
PDO::CASE_LOWER
强制列名是小写.
PDO::CASE_NATURAL
列名按照原始的方式
PDO::CASE_UPPER
强制列名为大写
PDO::ATTR_ERRMODE
错误提示
PDO::ERRMODE_SILENT
不显示错误信息,只显示错误码
PDO::ERRMODE_WARNING
显示警告错误
PDO::ERRMODE_EXCEPTION
抛出异常
PDO::ATTR_ORACLE_NULLS(不仅仅是ORACLE有效,别的数据库也有效): )
指定数据库返回的NULL值在php中对应的数值
PDO::NULL_NATURAL:
不变.
PDO::NULL_EMPTY_STRING
Empty string is converted toNULL
PDO::NULL_TO_STRING
NULL is converted to an empty string
PDO::ATTR_STRINGIFY_FETCHES
Convert numeric values to strings when fetching. Requiresbool.
PDO::ATTR_STATEMENT_CLASS
Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requiresarray(string classname, array(mixed constructor_args)).
PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL)
Whether to autocommit every single statement.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL)
Use buffered queries.

例子中的

$rs->setFetchMode(PDO::FETCH_ASSOC);
是PDOStatement::setFetchMode(),对返回类型的声明。

有如下:

PDO::FETCH_ASSOC– 关联数组形式
PDO::FETCH_NUM — 数字索引数组形式
PDO::FETCH_BOTH — 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ — 按照对象的形式,类似于以前的 mysql_fetch_object()更多返回类型声明(PDOStatement::方法名)看手册。★插入,更新,删除数据,
$db->exec(”DELETE FROM `xxxx_menu` where mid=43″);简单的总结一下上面的操作:查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()
PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,
PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。
PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()PDOStatement::fetchALL()。
PDOStatement::fetchColumn()是获取结果指定第一条记录的某个字段,缺省是第一个字段。
PDOStatement::fetch()是用来获取一条记录,
PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。
事务和自动提交至此,您已经通过 PDO 连接到了 mysql,在发出查询之前,您应该理解 PDO 是如何管理事务的。如果之前没有接触过事务,那么首先要知道事务的 4 个特征:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即 ACID。用外行人的话说,对于在一个事务中执行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不会受到来自其他连接的影响。事务性工作可以根据请求自动撤销(假设您还没有提交它),这使得脚本中的错误处理变得更加容易。
事务通常是通过把一批更改积蓄起来、使之同时生效而实现的。这样做的好处是可以大大提高这些更新的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。
不幸的是,并不是每种数据库都支持事务(Mysql5支持事务,mysql4我不知道),所以当第一次打开连接时,PDO 需要在所谓的“自动提交(auto-commit)”模式下运行。自动提交模式意味着,如果数据库支持事务,那么您所运行的每一个查询都有它自己的隐式事务,如果数据库不支持事务,每个查询就没有这样的事务。如果您需要一个事务,那么必须使用 PDO::beginTransaction() 方法来启动一个事务。如果底层驱动程序不支持事务,那么将会抛出一个 PDOException(无论错误处理设置是怎样的:这总是一个严重错误状态)。在一个事务中,可以使用 PDO::commit() 或 PDO::rollBack() 来结束该事务,这取决于事务中运行的代码是否成功。
当脚本结束时,或者当一个连接即将被关闭时,如果有一个未完成的事务,那么 PDO 将自动回滚该事务。这是一种安全措施,有助于避免在脚本非正常结束时出现不一致的情况 —— 如果没有显式地提交事务,那么假设有某个地方会出现不一致,所以要执行回滚,以保证数据的安全性。

组合数公式是指从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号c(n,m) 表示,下面我们来看用php来实现。

公式

有时候也表示成:

c(n,m)=p(n,m)/m!=n!/((n-m)!*m!)

2性质

c(n,m)=c(n,n-m);

3递推公式

c(n,m)=c(n-1,m-1)+c(n-1,m)

等式左边表示从n个元素中选取m个元素,而等式右边表示这一个过程的另一种实现方法:任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的分成两类情况,即m个被选择元素包含了特殊元素和m个被选择元素不包含该特殊元素。

 代码如下 复制代码

<?php
//实现数学上的组合数算法
header("content-type:text/html;charset=utf-8");
/**
 * 在数组$a中任意m个元素组合
 *
 * @param array $a 候选的集合
 * @param int $n 候选的集合大小
 * @param int $m 组合元素大小
 * @param array $b 储存当前组合中的元素,这里储存的是元素键值
 * @param int $M 相当一个常量,一直保持不变
 * @return */
function combine($a,$n,$m,$b,$M){
 for($i=$n;$i>=$m;$i--){
  $b[$m-1]=$i-1;
  if($m > 1){
   $combine[]=combine($a,$i-1,$m-1,$b,$M);
  }else{
   $onecombine='';
   for($j=$M-1;$j>=0;$j--){
    $onecombine.=$a[$b[$j]];
   }
   $combine[]=$onecombine;
   $onecombine='';
  }
 }
 return $combine;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数*/
function recursionarray($arr){
 $i=0;
 foreach($arr as $value){
  if(is_array($value)){
   $i+=recursionarray($value);
  }else{
   echo $value."<br/>";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D','E','F','G','H','I','J');
$b=array();
$combine=combine($a,10,5,$b,5);
$count=recursionarray($combine);
echo "总共有".$count."组合";
?>

发送json格式的数据有直接使用get url的方式或者post过来的方式,下文我们为各位总结这两种方式的json数据读取方法。

1.直接以文件形式输出的方式

 代码如下 复制代码

<?php

header("Content-type:text/html;charset=utf-8");
function GetCurl($url){
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl,CURLOPT_URL, $url);
    curl_setopt($curl,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    $resp = curl_exec($curl);
    curl_close($curl);
    return $resp;
}
$resp = GetCurl("http://www.111cn.net"); //这个是json数据文件
$resp = json_decode($resp,true);
header('Content-type: application/json');
echo json_encode($resp);

php远程读取json的方法分析

2. post过来的数据接受方式

 代码如下 复制代码

<?php
 $json_string = $_POST["txt_json"];
 if(ini_get("magic_quotes_gpc")=="1")
 {
  $json_string=stripslashes($json_string);
 }
 $user = json_decode($json_string);
 echo var_dump($user);
?>

在这个文件中,首先得到html文件中POST表单域txt_json的值,放入变量$json_string中,而后判断,如果当前PHP的设定为magic_quotes_gpc=On,即传入的双引号等会被转义,这样json_decode函数无法解析,因此我们要将其反转义化。而后,使用json_decode函数将JSON文本转换为对象,保存在$user变量中,最终用echo var_dump($user);,将该对象dump输出出来

php的HTTP_RAW_POST_DATA

用Content-Type=text/xml 类型,提交一个xml文档内容给了php server,要怎么获得这个POST数据。
The RAW / uninterpreted HTTP POST information can be accessed with: $GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).

由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。
另外还有一项 php://input 也可以实现此这个功能

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。

应用

 代码如下 复制代码

a.htm

<form action="post.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>

post.php


<? echo file_get_contents("php://input");?>

在php中我们要得到网站根目录可以用很多全局变量实现了,如可以利用__file__或DOCUMENT_ROOT等等变量来取得,下面一起看看几个例子。

__file__

dirname(__file__) //获取到的是这个软连接本身的绝对目录

如果想要在软连接的可执行php文件中获取网站的根目录的方法是:

$dir = $_SERVER['DOCUMENT_ROOT'] ; //#获取当前运行脚本所在的文档根目录。

php获取网站根目录方法一:

<?php
define("WWWROOT",str_ireplace(str_replace("/","\\",$_SERVER['PHP_SELF']),'',__FILE__)."\\");
echo WWWROOT ;
?>

php获取网站根目录方法二:

<?php
define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../')));  //定义站点目录
?>

php获取网站根目录方法三:

$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录。在服务器配置文件中定义

其它的获取目录的方法:

$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。

[!--infotagslink--]

相关文章

  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • Mysql在debian系统中不能插入中文的终极解决方案

    在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • php 判断是否是中文/英文/数字示例代码

    复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04
  • three.js显示中文字体与tween应用详析

    这篇文章主要给大家介绍了关于three.js显示中文字体与tween应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-04
  • JavaScript过滤字符串中的中文与空格方法汇总

    这篇文章主要介绍了JavaScript过滤字符串中的中文与空格方法汇总 的相关资料,需要的朋友可以参考下...2016-03-09
  • php中文转换成拼音代码

    <?php教程 function cn2pinyin($_string, $_code='gb2312') { $_datakey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|b...2016-11-25
  • php 根据啊拉伯数字转变成大写中文数字

    // 原是是根据用户输入的数字判断再转换成想要的大写数字,如果我们先把大小写存在一个数组,再判断进行转换就OK了。 $data = $_POST['rmb']; if (!ereg("^[0-9.]",$dat...2016-11-25
  • PHP把16进制的编码转为中文程序代码

    今天在做公司的项目的时候,遇到一个问题,群聊天记录存入数据库的时候把聊天记录及央视使用16进制转换,我在做将聊天记录导出为text文本的时候,需要将聊天记录先从16进制转...2016-11-25
  • 如何正确统计中文字数?

    PHP代码:-------------------------------------------------------------------------------- function ccStrLen($str) #计算中英文混合字符串的长度 { $ccLe...2016-11-25
  • 深度解析MySQL 5.7之中文全文检索

    InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符。一个词可以由多个字来组成,所以我们需要用不同的方式来处理。在MySQL 5.7.6中我们能使用一个新的全文索引插件来处理它们:n-gram parser。...2017-01-09
  • JS验证逗号隔开可以是中文字母数字

    这篇文章主要介绍了JS验证逗号隔开可以是中文字母数字 的相关资料,需要的朋友可以参考下...2016-04-24
  • JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xh...2013-10-07