php 矩阵转置 求素数 冒泡排序 选择排序例子

 更新时间:2016年11月25日 15:37  点击:1301
文章为各位初学php的朋友提供一篇关于php 矩阵转置 求素数 冒泡排序 选择排序例子,希望这个例子可以帮助到各位朋友哦。

关于矩阵转置:矩阵是指纵横排列的二维数据表格

关于求素数:质数公式,又称素数公式,在数学领域中,表示一种能够仅产生质数(素数)的公式。即是说,这个公式能够一个不漏地产生所有的质数,并且对每个输入的值,此公式产生的结果都是质数。由于质数的个数是可数的,因此一般假设输入的值是自然数集(或整数集及其它可数集)。迄今为止,人们尚未找到易于计算且符合上述条件的质数公式,但对于质数公式应该具备的性质已经有了大量的了解

冒泡选择排序:是两种排序方法就不介绍了

例子

 代码如下 复制代码

<?php
header("content-type:text/html;charset=utf-8");
/**
 *
 * PHP版数据结构基本算法
 * 1.矩阵转置
 * 2.求素数
 * 3.冒泡排序
 * 4.选择排序
 *//**
 * 矩阵转置
 *
 * @param array $matrix 待转置的矩阵
 * @param array return 转置后的矩阵
 * */
function transposition($matrix){
 $i=0;
 $j=0;
 foreach($matrix as $line){
  foreach($line as $element){
   $tm[$j++][$i]=$element;
  }
  $j=0;
  $i++;
 }
 return $tm;
}
$matrix=array(
 array(1,2,3,'a'),
 array(4,5,6,'b'),
 array(7,8,9,'c'),
);
echo "<br/>转置前的矩阵:";
foreach($matrix as $line){
 echo "<br/>";
 foreach($line as $value){
  echo $value."&nbsp;&nbsp;";
 }
}
$tm=transposition($matrix);
echo "<br/>转置后的矩阵:";
foreach($tm as $line){
 echo "<br/>";
 foreach($line as $element){
  echo $element."&nbsp;&nbsp;";
 }
}/**
 * 求素数
 *@param int  $n 求2~$n内的所有素数
 *@return array 返回2~$n所有的素数集合
 **/
function primenumber($n){
 $i=3;
 $prime=array(2);
 $tag=true;
 while($i<=$n){
  foreach($prime as $value){
   if($i % $value == 0){
    $tag=false;
    break;
   }
   $tag=true;
  }
  if($tag){
   $prime[]=$i;
  }
  $i++;
 }
 return $prime;
}
$n=200;
$prime=primenumber($n);
echo "<br />2~{$n}内的素数有:<br />";
foreach($prime as $value){
 echo $value."&nbsp;&nbsp;";
}/**
 * 冒泡排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function bubblingsort($data,$tag=0){
 $arrlen=count($data);
 for($i=$arrlen-1;$i>=0;$i--){
  for($j=0;$j<$i;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 1){
     $m=$data[$j];
     $data[$j]=$data[$i];
     $data[$i]=$m;
    }
   }else{
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>冒泡排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
/**
 * 选择排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function selectsort($data,$tag=0){
 $arrlen=count($data);
 for($i=0;$i<$arrlen-1;$i++){
  for($j=$i+1;$j<$arrlen;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }else{
    if($tag == 1){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>选择排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
?>

cookie跨域问题一直是一个大问题了,很多朋友都不知道怎么来解决就使用了json来处理了,其实还有一个更简单的办法,下面我们一起来看看吧

在setcookie 方法前,添加如下 header 即可

header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');
a.com/test

<script src="http://b.com/get_cookie.php"></script>
//b.com/get_cookie.php
header('P3P: ........');
setcookie(...)

a.com/test 可正常获取b.com/get_cookie.php 的cookie数据

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

简介

如1,2,3三个元素的全排列为:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

共3*2*1=6种 3!

2公式

全排列数f(n)=n!(定义0!=1)

递归算法

1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2

这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。所以我提出了解决方案,就是换位函数修改下
如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后

基本算法

以下介绍全排列算法四种:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法

实现全排列算法

 代码如下 复制代码

<?php

header("content-type:text/html;charset=utf-8");/**
 * @param array $a 待排列的元素集合,会动态变化
 * @param array $b 储存当前排列
 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合
 */
function wholerange($a,$b,$M){
 $range=array();
 if(count($a) > 1){
  $d=$b;
  foreach($a as $value){
   $b[]=$value;
   $c=array_diff($M,$b);
   if(count($c) > 0){
    $range[]=wholerange($c,$b,$M);
   }
   $b=$d;
  }
 }elseif(count($a) == 1){
  foreach($a as $value){
   $b[]=$value;
  }
  $onerange="";
  foreach($b as $value){
   $onerange.=$value;
  }
  $range[]=$onerange;
 }
 return $range;
}
/**
 * 递归输出数组
 *
 * @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');
$b=array();
$range=wholerange($a,$b,$a);
$count=recursionarray($range);
echo "总共有".$count."排列";
?>

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 将自动回滚该事务。这是一种安全措施,有助于避免在脚本非正常结束时出现不一致的情况 —— 如果没有显式地提交事务,那么假设有某个地方会出现不一致,所以要执行回滚,以保证数据的安全性。

在 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;
}
?>

[!--infotagslink--]

相关文章

  • antdesign-vue结合sortablejs实现两个table相互拖拽排序功能

    这篇文章主要介绍了antdesign-vue结合sortablejs实现两个table相互拖拽排序功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-09
  • C# 参数按照ASCII码从小到大排序(字典序)

    这篇文章主要介绍了C# 参数按照ASCII码从小到大排序(字典序)的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11
  • C#实现排序的代码详解

    在本篇文章里小编给大家整理的是关于C#实现排序的代码以及相关知识点,需要的朋友们参考下。...2020-06-25
  • 图文详解Heap Sort堆排序算法及JavaScript的代码实现

    这篇文章以图文详解Heap Sort堆排序算法及JavaScript的代码实现,堆排序算法基于类二叉树的堆数据结构,需要的朋友可以参考下...2016-05-05
  • js实现数组冒泡排序、快速排序原理

    这篇文章主要为大家详细介绍了js实现数组冒泡排序、快速排序的原理,感兴趣的小伙伴们可以参考一下...2016-03-10
  • 理解jquery事件冒泡

    这篇文章主要介绍了jquery事件冒泡,以及如何阻止jQuery事件冒泡现象,感兴趣的朋友可以参考一下...2016-01-07
  • c# n个数排序实现代码

    c# n个数排序实现代...2020-06-25
  • 分享javascript实现的冒泡排序代码并优化

    本文给大家汇总介绍了几个个人收藏的JavaScript实现冒泡排序的代码,都是非常的不错,有需要的小伙伴可以参考下...2016-06-12
  • C#使用linq对数组进行筛选排序的方法

    这篇文章主要介绍了C#使用linq对数组进行筛选排序的方法,实例分析了C#实用linq扩展进行数组排序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • JS实现的随机排序功能算法示例

    这篇文章主要介绍了JS实现的随机排序功能算法,结合具体实例形式分析了javascript常用的排序算法实现技巧,需要的朋友可以参考下...2017-06-15
  • C#实现冒泡排序算法的代码示例

    冒泡排序即是对数组每次轮循出最大数或最小数放在队尾,这里我们来看一下C#实现冒泡排序算法的代码示例,需要的朋友可以参考下...2020-06-25
  • 用js闭包的方法实现多点标注冒泡示例

    这两天在做地图这块,一点点js代码,各种坑。第一次接触js,各种难,下面就这几天的研究做一些总结,求坑 在事件监听器中使用闭包 在执行事件监听器时,通常可取的做法是将私有数据和持久性数据附加到对象中。JavaScript 不支...2014-05-31
  • 基于事件冒泡、事件捕获和事件委托详解

    这篇文章主要介绍了事件冒泡、事件捕获和事件委托,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-08
  • jQuery实现对无序列表的排序功能(附demo源码下载)

    这篇文章主要介绍了jQuery实现对无序列表的排序功能,涉及jQuery与javascript常见的文本操作函数与sort排序函数的相关使用方法,具有一定参考借鉴价值,需要的朋友可以参考下...2016-07-01
  • C++ 字符串去重排序实例代码

    这篇文章主要介绍了C++ 字符串去重排序实例代码的相关资料,需要的朋友可以参考下...2020-04-25
  • 利用JavaScript对中文(汉字)进行排序实例详解

    排序是我们在日常开发中经常遇到的一个功能,下面这篇文章主要给大家介绍了利用JavaScript对中文(汉字)进行排序的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。...2017-06-24
  • JavaScript数值数组排序示例分享

    但是,我们在使用中就会发现问题,这里的数组排序方法并不是按照我们想像中的数字大小来排序的,而是按照字符串测试结果改变原先的数据。这并不是我们想要的。那么如何才可以得到我们想要的按照我们思维中的数字大小来排序...2014-05-31
  • C++ STL关联式容器自定义排序规则的2种方法

    这篇文章主要介绍了C++ STL关联式容器自定义排序规则的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-04
  • C语言开发之归并排序详解及实例

    这篇文章主要介绍了 C语言开发之归并排序详解及实例的相关资料,需要的朋友可以参考下...2020-04-25