php5中魔术方法学习笔记

 更新时间:2016年11月25日 14:58  点击:1977
php5中魔术方法有9个哦,下面我给大家整理了魔术方法9个的使用与简单的应用例子,如果你有兴趣不防进入参考吧,希望文章对各位同学会带来帮助哦。

1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。

 

 代码如下 复制代码
class Test { function __construct() { echo "before"; } } $t = new Test();
class Test { function __construct() { echo "before"; } } $t = new Test();

输出是:

start

构造器是一个魔术方法,当对象被实例化时它会被调用。在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承。如果我们想到以前继承例子从介绍到oop,我们能添加构造方法到Animal 类中
1

 代码如下 复制代码

class Animal{

  public function __construct() {

    $this->created = time();

    $this->logfile_handle = fopen('/tmp/log.txt', 'w');

  }

}

现在我们创建一个类来继承Animal类 - Penguin类!不添加任何属性和方法在Penguin类中,我们能申明并定义它继承自

 代码如下 复制代码

Animal类,如:
class Penguin extends Animal {
}

$tux = new Penguin;
echo $tux->created;

我们知道php5对象模型 和类名相同的函数是类的构造函数,那么如果我们同时定义构造函数和__construct()方法的话,php5会默认调用构造函数而不会调用__construct()函数,所以__construct()作为类的默认的构造函数
2.__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
Java代码

 代码如下 复制代码
class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end
class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end

我们就可以在对象操作结束的时候进行释放资源之类的操作

3.__get() 当试图读取一个并不存在的属性的时候被调用。

如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。

 

 代码如下 复制代码
class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在
class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在

例子

 代码如下 复制代码

class Penguin extends Animal {

  public function __construct($id) {

    $this->getPenguinFromDb($id);

  }

  public function getPenguinFromDb($id) {

  }

}


4.__set() 当试图向一个并不存在的属性写入值的时候被调用。

 

 代码如下 复制代码

class Test { public function __set($key,$value) { echo '对'.$key . "附值".$value; } } $t = new Test(); $t->name = "aninggo"; 就会输出:对 name 附值 aninggo
class Test { public function __set($key,$value) { echo '对'.$key . "附值".$value; } } $t = new Test(); $t->name = "aninggo"; 就会输出:对 name 附值 aninggo

5.__call() 当试图调用一个对象并不存在的方法时,调用该方法。
 

 代码如下 复制代码


class Test { public function __call($Key, $Args) { echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true); } } $t = new Test(); $t->getName(aning,go);
class Test { public function __call($Key, $Args) { echo "您要调用的 {$Key} 方法不存在。你传入的参数是:" . print_r($Args, true); } } $t = new Test(); $t->getName(aning,go);
程序将会输出:


您要调用的 getName 方法不存在。参数是:Array
(
[0] => aning
[1] => go
)
您要调用的 getName 方法不存在。参数是:Array
(
[0] => aning
[1] => go
)

6.__toString() 当打印一个对象的时候被调用

这个方法类似于java的toString方法,当我们直接打印对象的时候回调用这个函数

 代码如下 复制代码


class Penguin {

 

  public function __construct($name) {

      $this->species = 'Penguin';

      $this->name = $name;

  }

 

  public function __toString() {

      return $this->name . " (" . $this->species . ")n";

  }

}

在适当的位置,输出该对象通过调用echo输出它,如:

 代码如下 复制代码

$tux = new Penguin('tux');

echo $tux;


7.__clone()

我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。

 代码如下 复制代码

class Test { public function __clone() { echo "我被复制了!"; } }$t = new Test(); $t1 = clone $t;程序输出:我被克隆了!


__sleep

__sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。

__wakeup

__wakeup()是与__sleep()方法相反的,允许您更改对象解序列化的行为。和__sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。


__autoload()方法可

比如我们将上面的那个Person类所在的文件定义为 Person_class.php ,
再新建一个php文件 test.php,编辑内容:

 代码如下 复制代码
function __autoload($calssName)
{
include $className.”_class.php”; //看到这也许你就明白了吧?哈哈
}
$p = new Person(“mifan”, 22);
$p->say();

这样执行该test.php页面就不会出现错误了。

php魔术方法一般在什么情况下需要使用


举个简单的例子,当类里面没有属性$name; 但是你不小心访问这个属性,这个时候就会出错。但是让你可以设置魔术方法__get($name){ return $name . "不存在"};就会自动调用__get($name);这样程序就会不因为你访问了一个不存在的属性报错而中断执行
补充下 __get($v) 访问未定义的属性时调用,
__set($v) ?未定义的属性赋值时调用,
__isset($v)对未定义的属性使用isset()函数时调用,
__unset($v)和isset($v)类似
__call($method)访问未定义的方法是被调用

 

下面来给大家介绍一个可能大家都常用模糊的php中Null 空 与0值区别分析,下面举了几个例子,大家仔细的看看吧。


例子。

 代码如下 复制代码

<?php
$test=0;
if($test==''){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===''){
 echo '<br />在php中,0即为空'; //不被输出
}
if($test==NULL){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===NULL){
 echo '<br />在php中,0即为空'; //不被输出
}
if($test==false){
 echo '<br />在php中,0即为空'; //被输出
}
if($test===false){
 echo '<br />在php中,0即为空'; //不被输出
}
?>

从上面看得出来当为空时就与0或null是相等了,但如果是精确比较时我们会发现0与空或null是以字符对比了这样就不会了,如果是普通对比他就是逻辑假来对比了,从这里我们可以看出0==false,null=false,''==false哦。

 

我在php学习在使用到最多的数据合并方法就是array_merge、array_merge_recursive函数了,当然还会少用到操作符(+)函数了,下面我来给大家整理一下这几个函数的一些用法。

PHP中,有3种方法来进行数组合并:操作符(+)、array_merge、array_merge_recursive,其中前两种方式为一维数组的合并,第三种为递归合并。
在说PHP的数组合并之前,先要明白,PHP的数组分为索引数组和关联数组。索引数组是指没有键值和键值为数字的数组,关联数组是指键值为字符的数组。

下面说说操作符(+)和array_merge的区别:

1.当为索引数组时,合并相同键值的数组,操作符以最前面的值为合并后的结果,array_merge则是把相同键值的数组合并,并重新索引(不同键值的数组合并时,也会从0开始重新生成数字索引)。

1、“+”运算符
规则:
  当两个数组的键名是数字键名或者字符串键名
  $c = $a + $b
  在$a后追加($b在$a中不存在的键名)键名和值
注意:
  1、不覆盖,只是追加不存在的键名和对应的值
  2、键名不重新索引
  3、无论是全部数字键名还是混合,都只是追加键名和值,如果键名相同则不进行追加,即把最先出现的值作为最终结果返回
例1:数字键名

 代码如下 复制代码

$a = array(
    'a',
);
$b = array(
    'u',
);
$c = $a + $b;
var_dump($c);
 
output:
array(1) {
  [0]=>
  string(1) "a"
}
 例2:数字键名

$a = array(
    66=>'a',
);
$b = array(
    60=>'u',
    66=>'c'
);
$c = $a + $b;
var_dump($c);
 
output:
array(2) {
  [66]=>
  string(1) "a"
  [60]=>
  string(1) "u"
}
例3:字符键名

<?php 
$a = array(
    1=>'a',
    2=>'b',
    'c'=>'c',
    'd'=>'d',
);
$b = array(
    1=>'u',
    3=>'v',
    'c'=>'w',
    'd'=>'x',
    'y'=>'y',
    60=>'z',
);
$c = $a + $b;
var_dump($c);
?>
 
output:
array(7) {
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
  ["c"]=>
  string(1) "c"
  ["d"]=>
  string(1) "d"
  [3]=>
  string(1) "v"
  ["y"]=>
  string(1) "y"
  [60]=>
  string(1) "z"
}

 

2.当为关联数组时,合并相同字符键值的数组,操作符合并规则是前面的覆盖后面的,array_merge则是后面的覆盖前面的。

例:

 代码如下 复制代码

$arr5 = array('a'=>'aaaa');
$arr6 = array('a'=>'bbbb');

var_dump($arr5+$arr6);
var_dump(array_merge($arr5,$arr6));
输出:
array (size=1)
  'a' => string 'aaaa' (length=4)
array (size=1)
  'a' => string 'bbbb' (length=4)


array_merge() 将一个或多个PHP数组合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

3.array_merge_recursive的合并规则和array_merge相同,只是array_merge_recursive支持多维数组的合并。

例:

 代码如下 复制代码

$a = array(

1=>'a',
2=>'b',
'c'=>'c',
'd'=>'d',

);

$b = array(
1=>'u',
3=>'v',
'c'=>'w',
'd'=>'x',
'y'=>'y',
60=>'z',

);

var_dump(array_merge_recursive($a,$b));

输出:

array (size=8)
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  'c' =>
    array (size=2)
      0 => string 'c' (length=1)
      1 => string 'w' (length=1)
  'd' =>
    array (size=2)
      0 => string 'd' (length=1)
      1 => string 'x' (length=1)
  2 => string 'u' (length=1)
  3 => string 'v' (length=1)
  'y' => string 'y' (length=1)
  4 => string 'z' (length=1)

下面来给大家分享一篇关于PHP开关语句Switch case学习笔记,如果你也正在学习php可以进入参考一下这篇文章,可能会给你带很大的帮助哦。

PHP 中的 Switch 语句用于执行基于多个不同条件的不同动作。如果你希望有选择地执行若干代码块之一,请使用 Switch 语句。

switch语法

 代码如下 复制代码

switch (expression)  //设置表达式
{
case label1: //比较标签1的值
 code to be executed if expression = label1; //如果匹配输出关联的代码
 break; //结束代码跳出语句
case label2: //比较标签1的值
 code to be executed if expression = label2;
 break;
default: //如果没有匹配,执行默认代码
 code to be executed
 if expression is different
 from both label1 and label2;
}

工作原理:

对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
如果没有 case 为真,则使用 default 语句

 代码如下 复制代码

<?php
$x = 1; //变量x赋值为4
switch ($x)
{
 case 1: //要比较的值为1
  echo "数字 1";
  break;
 case 2: //要比较的值为2
  echo "数字 2";
  break;
 case 3: //要比较的值为3
  echo "数字 3";
  break;
 default: //没有符合的匹配时,输出默认值
  echo "没有1到3的数字";
}
?>

学习经验, swicth case只是一个开关语句,如果有多条件或多种情况我们就不可以使用它了,这时我们需要使用if else来操作了。

在php中if可以使用直接if else 或ElseIf来判断其它可能的出现情况了,下面我来给大家介绍if else与ElseIf用法及一些细节上的区别了。

If…Else 语句

如果您希望在某个条件成立时执行一些代码,在条件不成立时执行另一些代码,请使用 if….else 语句。

语法

 代码如下 复制代码

if (condition) //设置条件
  code to be executed if condition is true; //如果条件为真的代码被执行;
else
  code to be executed if condition is false;  //如果条件为假,代码被执行


实例1
如果当前日期是星期一,下面的代码将输出 “星期一快乐。”,否则会输出 “天天快乐。”:

 代码如下 复制代码

<?php
$d=date("D"); //变量d赋值
if($d=="Mon"){
 echo "星期一快乐!";
}else{
 echo "天天快乐!";
}
?>

实例2

如果d等于1时输出“数字1”,否则输出“数字不是1”

 代码如下 复制代码
<?php
$d=2; //变量d赋值
if($d==1){
 echo "数字1"; //变量d等于1时输出的值
}else{
 echo "数字不是1"; //不等于1时输出的值
}
?>

ElseIf 语句

如果希望在多个条件之一成立时执行代码,请使用 elseif 语句:

语法

 代码如下 复制代码

if (condition) //条件1
  code to be executed if condition is true; //条件1为真,代码被执行
elseif (condition) //条件2
  code to be executed if condition is true; //条件2为真,代码被执行
else
  code to be executed if condition is false;  //2个条件都为假时,代码被执行


实例


当d的值等于1时,输出“数字1”;等于2时输出“数字2”;当两个条件都不成立时输出“没有符合的数字”

 代码如下 复制代码

<?php
$d=3; //变量d赋值
if($d==1){
 echo "数字1"; //当d等于1时输出“数字1”
}
elseif ($d==2){
 echo "数字2"; //当d等于2时输出“数字2”
}
else{
 echo "没有符合的数字"; //两个条件都不成立时输出的内容
}
?>

总结在 if else与ElseIf 中 if中可以包括有else与elseif但是如果使用了if else之后就不会出现elseif但相反就可以,从上面例子我们就可以看出来,更多php教程可点击连接查看。

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!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/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • mysql锁定单个表的方法

    mysql锁定单个表的方法 复制代码 代码如下:mysql>lock table userstat read; mysql>unlock tables; 页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INN...2014-05-31