PHP类中的__get()和__set函数到底有什么用

一、总结

一句话总结:当试图获取一个不可达变量时,类会自动调用__get。同样的,当试图设置一个不可达变量时,类会自动调用__set。在网站中,这两个并不是什么非用不可的函数。所以可以用于输出提示消息,或者返回值。

1、php中使用什么代替java面相对象中的常用的get和set方法?

类默认自带的__get()和__set()

2、php中类中默认自带的__get()方法什么时候被调用?

当试图获取一个不可达变量时,类会自动调用__get

所以在php中相当于可以直接用对象访问私有属性(因为会自动调用__get()方法)

3、php中如何调用类的私有属性?

a、new对象($modelTime =new ModelTime();)

b、用new出来的对象直接调用属性(echo $modelTime->perDayTS;die;)

c、在类中要写__get()方法返回值

10     public function __get($my_var){
11 return $this->$my_var;
12 }

二、PHP类中的__get()和__set函数到底有什么用?

当试图获取一个不可达变量时,类会自动调用__get。

同样的,当试图设置一个不可达变量时,类会自动调用__set。
在网站中,这两个并不是什么非用不可的函数。
 
例如:
Class Test
{
    private $a = 1;
    private $b = 2;
    public  $c = 3;
 
    public function  __get($vname)
    {
        return "you can not get";
    }
 
    public function __set($vname,$value)
    {
        echo  "you can not set";
    }
}
 
$t = new Test;
 
echo $t->a;//这里试图要打印出私有变量
$t->b=3;//这里试图要把私有变量进行设置
 
想要直接对私有变量操作,当然是做不到的。
于是在读取的时候,调用__get(),输出“you can not get”;
在设置的时候,调用__set(),输出“you can not set”。
 
顺便提一下,__get()和__set()函数要设置为public,要不然会Warning。
__get()和__set()函数定义时的参数分别为1个和2个,不管函数中到底有没用,都是不可省略的。
 
通过修改__get()和__set()函数内部的语句,就可以实现在外部调用类的私有变量。
例如:
private __get($vname)
{
    return $this->$vname;
}
如果$vname的值是a,那么就返回了正确的值。
__set()也同理。
 

public function __set($vname,$value)
{
    $this->$vname = $value;
}

 

参考:

PHP类中的__get()和__set函数到底有什么用? - East2_100 - 博客园
https://www.cnblogs.com/east2-100/p/5272699.html

 
 

三、php中使用类默认自带的__get()和__set()代替java中的常用的get和set方法

关键代码

 class Time extends Common
{
private $perDayTS;
public function __construct() {
parent::__construct();
$this->perDayTS=24*60*60;
echo "正在调用构造函数".$this->perDayTS;
} public function __get($my_var){
return $this->$my_var;
}

调用

     public function test1(){
$modelTime =new ModelTime();
echo $modelTime->perDayTS;die;
}
 
 
 

PHP类中的__get()和__set函数到底有什么用的更多相关文章

  1. PHP类中的__get()和__set函数到底有什么用?

    当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数.   例如: Class Test {   ...

  2. PHP中的__get和__set理解

    先来了解一下PHP类中的__get和__set函数 当我们试图获取一个不可达属性时(比如private),类会自动调用__get函数.当试图设置一个不可达属性时(比如private),类会自动调用__ ...

  3. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  4. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  5. MFC 如何在一个类中使用在其他类中定义的变量或函数

    [声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...

  6. PHP中的__get()和__set()方法获取设置私有属性

    在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...

  7. PHP – 在类中使用array_filter时回调函数的问题

    了一个类处理好友,其中有一个方法用来同步好友,而这个方法中需要从微博传来的关注列表和粉丝列表中,找到互相关注的用户,记录一下经验,主要还是关于回调函数. 按照我最初的理解,这样写就可以了 privat ...

  8. PHP面向对象魔术方法之__get 和 __set函数

    l 基本的介绍 (1) 当我们去使用不可以访问的属性时,系统就会调用__get方法. (2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性) ...

  9. 【c++】类中带默认参数的函数

    反思两个问题 1. 带默认参数的函数,为何声明.定义不能同时有参数? 2. 带默认参数的函数, 为何带默认参数的参数靠后站? 上程序 #include <iostream> #includ ...

随机推荐

  1. vmware启动虚拟机报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine is stored is almost full. To continue, free an additional 1.4 GB of disk space.

    报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine i ...

  2. KM最大匹配 HDU 2255

    KM算法详解+模板 - wenr - 博客园  http://www.cnblogs.com/wenruo/p/5264235.html #include<iostream> #inclu ...

  3. 第二十四天 框架之痛-Spring MVC(四)

    6月3日,晴."绿树浓阴夏日长. 楼台倒影入池塘. 水晶帘动微风起, 满架蔷薇一院香". 以用户注冊过程为例.我们可能会选择继承AbstractController来实现表单的显示 ...

  4. C语言typedef struct具体解释

    在C中定义一个结构体要用typedef,如: typedef struct Student { int a; }Stu; 于是在声明变量的时候就能够:Stu stu1;(假设没有typedef就必须用 ...

  5. Visual Code的调试

    Run 'Debug: Download .NET Core Debugger' in the Command Palette or open a .NET project directory to ...

  6. 360动态加载的Android插件框架

    github地址:https://github.com/Qihoo360/DroidPlugin DroidPlugin 是360手机助手在Android系统上实现了一种新的插件机制:它可以在无需安装 ...

  7. 关于WMware Workstation出现 “”该虚拟机似乎正在使用中“”解决办法

    如图 直接到配置文件D:\centos1\这个目录下 将vmdk.lck文化删除 然后重新打开虚拟机便可进入 问题解决

  8. java httpRequest和Response

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  9. codefroces 650A. Watchmen

    A. Watchmen time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...

  10. Struts(18)标签

    控件标签 Struts 2 的标签有一组标签.更easy控制流程页面运行.下面是重要的Struts2控制标签列表: if /else 标签: 这些标签运行可在每一种语言找到的一种基本条件流程. 'If ...