PHP面向对象的魔术方法

<?php
/**
* Created by PhpStorm.
* User: fu
* Date: 2017/7/19
* Time: 9:41
*/

class Person{

protected $name;
private $age;

private $mobile;

function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;

}

/**
* 测试使用的不能直接访问的函数
* @param $info
*/
protected function test1($info){
echo ‘我的信息:‘.$info;
}
private function test2(){
echo ‘我不能被直接访问哦~!~!~‘;
}

// /**
// * @return mixed
// */
// public function getName()
// {
// return $this->name;
// }

/**
* __get魔术方法,当在类的外部调用不能直接访问的属性时,该函数方法被自动调用
* 下面的格式是该魔术方法的标准形式,不能改变
* 魔术方法必须是公共的(public),且不能定义为静态的(static),除了__callStatic
* __get必须有返回值,所以最后结束的肯定是return语句
* @param $name 被访问的属性的名称,它必须是一个字符串
*/
public function __get($name){
// echo ‘在类中查找对应名称的属性:‘.$name;
if(isset($this->$name)){
return $this->$name;
}else{
return null;
}
}

/**
* 魔术方法__set,当设置类中的不能直接访问的属性时,自动调用该函数方法
* 下面的格式是该魔术方法的标准形式,不能改变
* __set不需要返回值
* @param $name 需要设置值的类的属性名称
* @param $value 需要设置的值
*/
public function __set($name, $value){
/*
* property_exists 它用于判断类当中是否包含某个指定名称的属性
*/
if (property_exists($this, $name)){
$this->$name=$value;
}
}

/**
* 魔术方法,判断类中的属性是否被设置了
* 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
* @param $name 传入的是类的属性名称
* @return bool 如果属性存在,则返回true;如果不存在,返回false
*/
function __isset($name){
if (property_exists($this, $name)){
return isset($this->$name);
}else{
return false;
}
}

function __unset($name){
if (property_exists($this, $name)){
$this->$name = null;
}else{
return null;
}
}

/**
* 在对象中调用一个不能直接访问的非静态方法时,__call() 会被自动调用。
* @param $name 被访问的函数方法的名称,字符串格式
* @param $arguments 传递过来的函数方法的参数,数组格式
*/
function __call($name, $arguments){
// echo ‘需要被访问的函数名称:‘.$name;
// var_dump($arguments);
if(method_exists($this, $name)){
call_user_func_array(array($this, $name), $arguments);
}else{
echo ‘没有对应的函数可以被调用‘;
}

}

/**
* 魔术方法,当以字符串格式输出类的对象时,默认被自动调用
* 该函数方法结束必须有一个return语句,且返回的值必须是字符串
*/
function __toString(){
return ‘姓名:‘.$this->name.‘,年龄:‘.$this->age;
// return 100;
}

/**
* 当类的对象被克隆时自动调用执行
* 在这里可以修改被克隆的数据值
*/
function __clone(){
echo ‘<br>数据对象被复制了一个备份<br>‘;
$this->age = 35;
}

}

$p = new Person(‘李四‘, 30);
//$p->test1(‘成都‘);
//echo ‘<br><br>‘;
//$p->test2();
//echo ‘<br><br>‘;
//$p->test3();

//echo ‘<br><br>‘;
//echo $p;
//print $p;
echo ‘<br><br>‘;
print_r($p);
echo ‘<br><br>‘;
$p2 = clone $p;
$p2->name = ‘王五‘;
print_r($p2);

//echo ‘<br><br>‘;
//var_dump($p);

//echo $p->name;
//echo $p->age;
//echo $p->mobile;
//var_dump($p);
//
//
//$p->name = ‘成都‘;
//$p->mobile = ‘13066666666‘;
//$p->birth = ‘2000-01-01‘;
//
//unset($p->age);
//echo ‘<br><br>修改后的对象值:‘;
//var_dump($p);
//
//
//if(isset($p->name)){
// echo ‘OK‘;
//}else{
// echo ‘No‘;
//}

时间: 2024-07-30 07:52:51

PHP面向对象的魔术方法的相关文章

对php面向对象中魔术方法的认识

<?php//header(charset="utf8");    //echo 'hey 这里是描述我对php 面向对象中各种魔术方法的认识.';/* *魔术方法是在一些特定情况下会自动调用的一些php系统自定义函数 *这些函数都很有个性,他们统一以__两个 _ (下划线)开头. * 下面对于php 中这些常用的魔术方法一些个人认识. **/class demo {    public $name;    public $age; //当实例化这个类,首先会自动调用的方法 __

PHP面向对象之魔术方法复习

魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 用于类实例化时自动运行的方法 常用于初始化成员属性值等 2.__destruct() 析构函数 用于类销毁时自动运行的方法 常用语销毁资源.关闭资源等 3.__set($param,$value) 用于给对象中非公有的成员属性设置值时自动调用的方法 例如: 1 public function __

面向对象之魔术方法

魔术方法是一种特殊的系统定义的函数方法,写在我们自定义的类中,不需要我们去调用,满足条件后自动调用.PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法.所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀.魔术方法现有15种,__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toStri

面向对象进阶---魔术方法

内置方法 双下方法 魔术方法: 都是python的对象内部自带的 并且都不需要我们自己去调用它 1.  __str__  __repr__:改变对象的字符串显示   输出的类型为str class Course: def __init__(self, name, price, period): self.name = name self.price = price self.period = period def __repr__(self): # 备胎 return '%s,%s,%s' %

[麦先生]PHP面向对象中常见的魔术方法以及关键字

麦先生引言:在学习php面向对象的编程思想中,我们会遇到很多的能够自动调用的魔术方法,每个魔术方法都有其特定的触发场景,但其根本目的是在于编写和实际使用过程中阻止程序报错而生; 常见的魔术方法有:music=> gusic(根据首字母拼音大写由gusic联想到music)    以及构造,析构方法,以及特殊的关键字fsci -- cats 和 ai 魔术方法                触发场景 <!--gusic---------------------------------------

前端学PHP之面向对象系列第二篇——魔术方法

显示目录 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这些方法为面向对象实现提供了便利,本文将详细介绍魔术方法 构造方法 大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,通常用它执行一些有用的初始化任务 构造函数的声明与其它操作的声明一样,只是其名称必须是两个下划线__construct( ).这是PHP5中的变化:

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $

PHP面向对象常见的关键字和魔术方法

在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对象的应用能力,例如__call().__toString().__autoload等. ①final关键字的应用 final关键字的作用如下:a.实用final标识的类,不能被继承.b.在类中使用final标识的成员方法,在子类中不能被覆盖. 在下面的例子中声明一个MyClass类,并使用final

面向对象中所有的魔术方法和关键字

魔术方法构造函数,对类里面成员进行初始化function __construct(){}析构函数,在对象释放的时候自动执行function __destruct(){} __set方法function __set($name,$value){}                                                          __set和__get  主要用在封装里面__get方法function __get($name){} __tostring()方法