php学习九:存取器&魔术方法

当声明属性的时候用到了private,那么的话只能本类中才能访问此属性,其他地方无法使用,这个时候需要给外界提供一些方法来使外界访问

方法一:存取器:

可以提供一个public的方法来使外界对类里面的属性进行访问和赋值

class Student
{
    private $name;
    private $age;
    public function show(){
        echo "{$this->name}今年{$this->age}岁了";
    }
    /*****存取器:get,set******/
    /****提供set方法给外界赋值***/
    public function setName($name){
        $this->name=$name;
    }
    public function setAge($age){
        if($age<0){
            $this->age = "18";
        }else{
            $this->age=$age;
        }
    }

    /******提供get方法给外界取值**********/
    public function getName(){
        return $this->name;
    }
    public function getAge(){
        return $this->age;
    }
}

 实例化的代码:

$stu = new Student();
/*****不能直接访问,需要用类里面的set,get方法来访问******/
$stu->setName("房明");
echo $stu->getName();

$stu->setAge(-18);
echo $stu->getAge();

$stu->show();

  

方法二:魔术方法进行访问

在php中文诶我们提供了许多的魔术方法,在这里我们只要是某某一个魔术方法就可以完成我们想要的效果

*__set():赋值* __get():取值* __isset():是否有这个属性* __unset():销毁某个属性

代码如下:
class User
{
    private $name;
    private $age;

    /*****__set():赋值****/
    function __set($name,$value)
    {
        if($name == "age"){
            if($value <18){
                $this->age = 18;
            }else{
                $this->age = $value;
            }
        }else{
            $this->$name = $value;
        }
    }

    /****__get():取值***/
    function __get($name)
    {
        if($name == "name"){
            return "dog";
        }else{
            return $this->$name;
        }
    }

    /***** __isset():是否有这个属性****/
    //当当前属性被isset()或者empty(),即当某个属性被检验空的方法调用的时候,会触发这个方法
    function __isset($name)
    {
        echo "{$name}isset被调用了";
    }

    /*******__unset():销毁某个属性******/
    //
    function __unset($name)
    {
        echo "{$name}被销毁了";

        //防止被销毁的时候直接写一个return即可;
    }

    public function show(){
        echo "{$this->name}今年{$this->age}岁了";
    }
}

  魔术方法进行访问:

$user = new User();
$user->name = "房明";
$user->age = 10;
echo $user->name;

echo $user->age;

$user->show();

isset($user->name);

unset($user->name);

  

时间: 2024-10-10 06:05:19

php学习九:存取器&魔术方法的相关文章

【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值,setter函数就是可以设置实例变量的值.(当然假设你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数.取--返回值getter函数. (1)先在类的.h文件中面声明这个函数(方法).一般都有默认的格式(例如以下):返回值函数的函数名字一般都

【OC学习-9】利用@property属性和@synthesize简化实例变量的存取器方法

如果我们在一个类中定义了3个实例变量,那么如果要写存取器方法的话,需要写6个(每个实例变量各一个setter和getter).现在的简化方法是: (1)在类的.h文件里,只要写了属性,那么这个实例变量就可以被操作,如果想要不被操作保证安全,那么就不要声明属性,只要写在实例变量里即可. #import <Foundation/Foundation.h> //我们一般会省略实例变量的写法,因为写了属性后,一般会自动生成同名的实例变量 @interface ASStudent : NSObject{

【OC学习-8】存取器方法?getter和setter?其实就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量如果默认的话都是protected类型,一般无法直接访问,更别提赋值和调用了,所以就产生了两种函数,getter函数就是能够返回实例变量的值,setter函数就是能够设置实例变量的值.(当然如果你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数,取--返回值getter函数. (1)先在类的.h文件里面声明这个函数(方法),一般都有默认的格式(如下):返回值函数的函数名字一般都和变

上下文管理器的重写以计算术运算对应的魔术方法

一.上下文管理器 概念:上下文管理器是一个Python对象,为操作提供了额外的上下文信息,这种额外的信息,在使用with语句初始化上下文,以及完成with 块中的所有代码是,采用可调用的形式. 实现一个上下文管理器需要实现两个方法:1. object._enter_(self) 输入与此对象相关的运行时上下文.如果存在的话,with语句将绑定该方法的返回值到该语句的as字句中指定的目标. 2. object._exit_(self,exc_type,exc_val,exc_tb) exc_typ

php 魔术方法学习笔记

__get()  __set()    __isset()   __unset __call   __callstatic __call是调用不可见(不存在或者没权限)的方法时,自动调用. $lisi->say(1,2,3)   对象中并不存在say 方法   __call("say",array(1,2,3))运行 __get()用来获取私有成员的属性值,有一个参数,参数传入你要获取的私有成员的属性名称,返回的是获取的值.该方法不用我们手工去调用,只需要封装在类里面就好了.如果

PHP学习笔记——10.魔术方法

1.定义 是指在某些特定情况下会自动调用的方法 PHP提供了多个魔术方法,都是以__开头的 2.构造方法 __construct 当实例化对象时,会自动调用该方法 可用于在实例化对象时传参,以控制类的属性 class 类名 { private 属性名 = null; public function __construct ($形参) { $this -> 属性名 = $形参; } } $对象 = new 类名('实参'); echo $对象 -> 属性名; 3.析构方法 __destruct

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

[学习记录]python魔术方法与抽象方法like型反思

之前一直没搞懂python的魔术方法是怎么回事,今天看到一篇讲的很好的文章,这里先把链接贴出来 总的来说魔术方法就是定义成用两条下划线包围方法名前后的一种方法,例如__init__,__del__等等 换句话说,当你在python中使用dir()时,看到的那么一大堆__方法__都是魔术方法,如下图 test类只定义了一个hello方法,但是dir展示了大量的魔术方法.这些魔术方法都是内置的,但是允许我们对它们进行重写. 对比一下会感觉有点像定义的接口类的抽象方法,定义出来作为模板,然后由子类对其

pyhton中的魔术方法

魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组,顺序为它们在基类列表中出现的顺序 __doc__ 类.函数的文档字符串,如果没有定义则为 None __mro__ 类的mro,class.mro()返回的结果的保存在 __mro__ 中 __dict__ 类或实例的属性,可写的字典 查看属性 __dir__ 方法 方法 说明 __dir__ 返