精华内容
下载资源
问答
  • PHP:在类中获取访问私有变量
    2021-03-26 11:38:22

    看看这种方法。

    第一:创建实体,其存储和私有属性$数组内检索数据,并与魔__set(),__get()也可以这样做:$对象 - >变量= 123

    第二:与人类扩展的实体,并添加一些特定于子类的功能(例如hasValidAge()):

    class Entity {

    private $attributes;

    public function __construct($attributes = []) {

    $this->setAttributes($attributes);

    }

    public function setAttribute($key, $value) {

    $this->attributes[$key] = $value;

    return $this;

    }

    public function setAttributes($attributes = []) {

    foreach($attributes AS $key => $value) {

    $this->setAttribute($key, $value);

    }

    }

    public function getAttribute($key, $fallback = null) {

    return (isset($this->attributes[$key]))?

    $this->attributes[$key] : $fallback;

    }

    public function __get($key) {

    return $this->getAttribute($key);

    }

    public function __set($key, $value) {

    $this->setAttribute($key, $value);

    }

    }

    class Human extends Entity {

    public function __construct($attributes = []) {

    $this->setAttributes($attributes);

    $this->checkAge();

    }

    public function hasValidAge() {

    return ($this->getAttribute('age') > 12)? true : false;

    }

    }

    $boy = new Human(['name' => 'Mark', 'age' => 14]);

    if($boy->hasValidAge()) {

    echo "Welcome ".$boy->name."!";

    }

    ?>

    PS我删除了回声“欢迎!”部分来自构造函数,因为从模型对象进行回声并不酷,在我们的例子中,人类是实体的模型。

    更多相关内容
  • 我已经创建了一个基类,并分配了私有变量.我有扩展这个基类的子类,它通过基类的函数对这些私有变量进行引用和更改.这是一个例子,请记住我仍然对私有和受保护的方法/变量之间的区别感到困惑(让我知道我做错了!):base...

    所以我正在尝试解决我在设计PHP类时遇到的问题.我已经创建了一个基类,并分配了私有变量.我有扩展这个基类的子类,它通过基类的函数对这些私有变量进行引用和更改.这是一个例子,请记住我仍然对私有和受保护的方法/变量之间的区别感到困惑(让我知道我做错了!):

    base.class.php

    class Base {

    private $test;

    public function __construct(){

    require('sub.class.php');

    $sub = new Sub;

    echo($this->getTest());

    }

    public function getTest(){

    return $this->test;

    }

    protected function setTest($value){

    $this->test = $value;

    }

    }

    ?>

    sub.class.php

    class Sub extends Base {

    public function __construct(){

    parent::setTest('hello!');

    }

    }

    ?>

    所以我希望结果是你好!印在屏幕上 – 而不是什么都没有.我可能会对课程产生根本性的误解,或者我可能只是做错了什么.非常感谢任何指导!谢谢.

    编辑:

    感谢所有提供答案的人 – 我认为,尽管有很好的解决方案,但是这些子类实际上并不是我需要的 – 似乎委托类在这一点上可能更有用,因为我真的不需要引用Base其他类中的函数.

    解决方法:

    应该是这样的:

    base.class.php:

    class Base {

    private $test;

    public function __construct() {

    echo $this->getTest();

    }

    public function getTest() {

    return $this->test;

    }

    protected function setTest($value) {

    $this->test = $value;

    }

    }

    sub.class.php:

    class Sub extends Base {

    public function __construct() {

    parent::setTest('hello!'); // Or, $this->setTest('hello!');

    parent::__construct();

    }

    }

    主要代码:

    require 'base.class.php';

    require 'sub.class.php';

    $sub = new Sub; // Will print: hello!

    标签:php,class,oop,private,protected

    来源: https://codeday.me/bug/20191008/1870715.html

    展开全文
  • ———————————————————————— 就是注释中提到的问题:关于__unset一个私有变量后,通过该类的函数访问私有变量时发生的自动调用__get()函数的现象,和有时候调用__get()函数时却执行两次的...

    代码:

    class Example{

    private $p1;

    private $p2;

    function __construct($a,$b){

    $this->p1=$a;

    $this->p2=$b;

    }

    function __get($elmname){

    echo "调用get啦!"; //为了跟踪get函数的调用,所以才输出!

    if($elmname=="p2")

    return "保密";

    return $this->$elmname;

    }

    function __set($elmname,$value){

    if($elmname=="p1"&&$value>100)

    echo "error!"."
    ";

    else

    $this->$elmname=$value;

    }

    function __isset($name){

    return isset($this->$name);

    }

    function __unset($name){

    unset($this->$name);

    }

    function __destruct(){

    echo "
    已经被摧毁!
    ";

    }

    function getp2(){

    return $this->p2;

    }

    }

    $example=new Example("v1","v2");

    $example->p2="vs";//相当于调用了__set函数把$example的私有属性p2 设置为"vs".

    echo $example->getp2()."
    ";//所以用getp2()方法获得p2的值是vs

    var_dump(isset($example->p2));//此时p2已被设置为vs所以输出bool(true)

    unset($example->p2);//此时unset一下$example的私有属性p2

    var_dump(isset($example->p2));//因为已经被unset了所以输出bool(false)

    //以上部分暂时一切正常,但是因为已经用了unset,所以后面出现了一些我不能理解的事情

    echo $example->getp2()."
    ";//此时p2已经被unset了,所以没有值了,按理说应该不输出,可是神奇的一幕发生了,此时他竟然自动调用了__get函数,输出保密!

    echo $example->p2;//于是我亲自调用了__get()函数,发现正常!

    unset($example->p1);//然后我把p1也unset掉了!

    var_dump(isset($example->p1));//所以这句也输出保密bool(false)

    echo $example->p1;//神奇的一幕又发生了!同样是被unset掉的,这次我亲自调用的__get函数却执行了两遍

    ?>

    ————————————————————————

    输出的结果是:

    vs

    bool(true) bool(false) 调用get啦!保密

    调用get啦!保密bool(false) 调用get啦!调用get啦!

    已经被摧毁!

    ————————————————————————

    就是注释中提到的问题:关于__unset一个私有变量后,通过该类的函数访问该私有变量时发生的自动调用__get()函数的现象,和有时候调用__get()函数时却执行两次的现象!!

    神奇啊!!

    谁能帮我解释一下为什么会出现这些现象啊?为什么__unset一个私有变量后,再访问该变量的时候,__get()函数就会不正常的执行啊?能告诉我这里面具体的调用机制么?

    当读取类的不存在的属性时,__get 方法就会被调用

    你遇到的正是这个,没有什么不可理解的

    我echo输出时添加了__LINE__结果是

    36vs

    bool(true) bool(false) 调用get啦!40保密

    展开全文
  • 直接访问私有变量@

    2018-10-14 11:08:07
    #客户端读取修改私有变量@ #创建属性 class Critter(object): """A virtual pet""" def __init__(self,name): print("A new critter has been born!") self.__name = ...
    #客户端读取修改私有变量@
    #创建属性
    class Critter(object):
        """A virtual pet"""
        def __init__(self,name):
            print("A new critter has been born!")
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.setter
        def name(self,new_name):
            if new_name == "":
                print("A critter's name can't be the empty string")
            else:
                self.__name = new_name
                print("Name change successful!")
        def talk(self):
            print("\nHi,i'm",self.name)
    crit = Critter("Poochie")
    crit.talk()
    #在类外部直接访问私有变量name
    print("\nMy critter's name is:",end = " ")
    print(crit.name)
    #类外部直接修改私有变量name,传递参数给name.setter
    print("\nAttempting to change my critter's name to Randolph...")
    crit.name = "Randolph"
    
    
    
    A new critter has been born!
    
    Hi,i'm Poochie
    
    My critter's name is: Poochie
    
    Attempting to change my critter's name to Randolph...
    Name change successful!
    
    
    
    展开全文
  • 如果您想将私有变量与公共getter和setter一起使用,或者您只是想将变量直接声明为public,则会因情况而异.使用“getter”和“setter”可能是好的原因是,如果你想控制某人访问数据的时间.举个例子,假设你得到了这个:...
  • <p>I've been doing a project in PHP for the last few hours and I have encountered into a problem. <p>The problem is I don't know how to access private variables in a class and I can't find it online....
  • 我也明白,这适用于私有财产和方法以及公共方法。我想知道的是什么是静态私有功能可以让你获益。例如:class Beer {static private $beertype = "IPA";private function getBeerType() {return self::$beertype;}...
  • Home\Common\Map.class.php文件namespace Home\Common;class Map {static function getName() {$map = array('0' => '张三','1' => '李四','2' => '王五','3' => '赵六');return $map;}}Home\Controller...
  • PHP访问父类变量

    2021-04-19 01:48:43
    变量是继承的,不是私有的,所以它是当前对象的一部分。以下是对您有关使用parent的详细信息的要求的其他信息:::当您要为父类添加额外的功能时,请使用parent ::例如,假设飞机课程:class Airplane {private $pilot...
  • 我刚刚开始学习面向对象的编程,只是通过观察发现,在所有的例子中,成员变量都是私有的.通常情况如何?// Classclass Building {// Object variables/propertiesprivate $number_of_floors = 5; // These buildings ...
  • 这里使用的是对象变量,而不是类变量(在PHP中由static表示),并且对象没有子/父关系。 在programmers.stackexchange.com/questions/151910/&hellip;-摘录:不可能。 实际上,我在这里使用的对象变量不是(静态的和...
  • 反射是字节码文件加载到方法区时,会自动的生成class对象 创建class对象的三中方法 1.通过类名:类名.class 2.通过对象 ...下图中是:通过反射获取私有的成员变量和成员方法的代码步骤 ...
  • 如果类里面定义了__get($name)方法,则不论类的private成员还是public成员,都能够在类的外面通过类似$...如下例,由于访问的成员变量是private变量,因此底层会通过调用get方法获取该变量。class Page {private $p...
  • function Customer(name) {var risk = 0;this.name = name;}var customer = new Customer("aa");console.log(customer.name); // aaconsole.log... // undefined请问为何customer.risk无法访问而customer.name可...
  • C语言中结构体变量私有化详解背景介绍操作系统 : CentOS7.3.1611_x64gcc版本 :4.8.5什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以...
  • 类的私有成员可在本类的成员函数中进行访问。...如果要在其他类中获得私有成员变量,那么可以在本类中写一个public的get方法,其他类就可以通过调用这个get方法获得私有成员变量。class PrivateTes...
  • 实例classGirlFriend{//定义一个女朋友类/*类中的成员{属性(变量)---静态描述:姓名、性别、年龄、身高、体重、三维方法(函数)---动态描述:说话、奔跑、可以生孩子、洗碗、}*///--------------------------start---...
  • php怎么把局部变量变成全局变量1. php 局部变量如何访问全局变量$arr = array( 0,1,2,3 );function tojsarr(){global $arr; // 调用全局变量return json_encode( $arr );}?>js_arr = ...
  • 你是通过公有的方法去访问私有的方法,这是可以的 public void hello() 是公有方法 它是允许调用本类的私有方法 依照你上述的例子并不能说子类能访问父类的私有方法。因为hello本身就是父类的方法。 如果子类是这样...
  • 类似这种关于代码规范的问题,目前我的观点是:跟随你面对的团队,跟随你面对的代码块最近两次被别人问到php私有变量加下划线的问题,由于我开始也是这么做的,但是最后还是没用下划线了。最后想想还是把自己的想法说...
  • php怎样定义全局变量

    千次阅读 2021-03-22 19:47:47
    Global是php中一个比较特殊的命令,大家直接叫他超级全局变量了,下面我来介绍我今天在使用Global定义全局学习笔记了很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就是无法相互访问。比如下面...
  • 私有属性方法

    2021-04-26 14:21:49
    1. __set() 方法用于设置私有属性值。2. __get() 方法用于获取私有属性值。3. __isset() 方法用于检测私有属性值...虽然可以将对属性的访问写成一个方法来实现,但 PHP 提供了一些特殊方法来方便此类操作。__set()...
  • <?php class City{ private $_cityName; private $_population; //function city($_cityName,$_population){} php5.3.3起在有命名空间的类中,类同名方法不再视为构造方法而是常规方法,无命名空间类中不影响 ...
  • 在介绍关键部分之前,我们先回顾一下php面向对象的访问控制。对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被...
  • php静态变量方法1、静态全局变量定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。特点:A、该变量在全局数据区分配内存。B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动...
  • 文章目录PHP反序列化漏洞level4-[本地复现]-[伪变量$this调用私有属性]-[私有和保护属性的序列化]1.题目描述2.代码审计3.解题过程4.总结 PHP反序列化漏洞 level4-[本地复现]-[伪变量$this调用私有属性]-[私有和保护...
  • 我想在非常罕见的特定情况下从类外部访问私有方法和变量.我已经看到尽管使用了内省,但这是不可能的.具体案例是下一个案例:我想要这样的东西:class Console{final public static function run() {while (TRUE != ...
  • 什么时候以及为什么应该在类内使用public , private和protected函数和变量? 它们之间有什么区别?例子:// Publicpublic $variable;public function doSomething() {// ...}// Privateprivate $variable;private ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,301
精华内容 8,120
关键字:

php访问私有变量