-
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我删除了回声“欢迎!”部分来自构造函数,因为从模型对象进行回声并不酷,在我们的例子中,人类是实体的模型。
更多相关内容 -
PHP来自孩子的私有变量访问
2021-04-07 08:07:12我已经创建了一个基类,并分配了私有变量.我有扩展这个基类的子类,它通过基类的函数对这些私有变量进行引用和更改.这是一个例子,请记住我仍然对私有和受保护的方法/变量之间的区别感到困惑(让我知道我做错了!):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
-
php关于__unset后访问私有变量的问题
2021-04-30 02:24:17———————————————————————— 就是注释中提到的问题:关于__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的值是vsvar_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!
-
php – 私有变量的优点/缺点?
2021-03-26 11:37:46如果您想将私有变量与公共getter和setter一起使用,或者您只是想将变量直接声明为public,则会因情况而异.使用“getter”和“setter”可能是好的原因是,如果你想控制某人访问数据的时间.举个例子,假设你得到了这个:... -
PHP:在类中访问私有变量
2015-09-02 11:12:49<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.... -
php – 私有静态方法与静态方法
2021-04-19 05:29:32我也明白,这适用于私有财产和方法以及公共方法。我想知道的是什么是静态私有功能可以让你获益。例如:class Beer {static private $beertype = "IPA";private function getBeerType() {return self::$beertype;}... -
ThinkPHP遇到的类私有变量赋值问题
2021-04-24 23:13:10Home\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... -
php – 为什么成员变量通常是私有的?
2021-04-12 10:08:45我刚刚开始学习面向对象的编程,只是通过观察发现,在所有的例子中,成员变量都是私有的.通常情况如何?// Classclass Building {// Object variables/propertiesprivate $number_of_floors = 5; // These buildings ... -
关于php:如何从父类访问子类变量
2021-03-22 20:19:34这里使用的是对象变量,而不是类变量(在PHP中由static表示),并且对象没有子/父关系。 在programmers.stackexchange.com/questions/151910/&hellip;-摘录:不可能。 实际上,我在这里使用的对象变量不是(静态的和... -
通过反射获取私有的成员变量和成员方法
2022-04-13 00:47:29反射是字节码文件加载到方法区时,会自动的生成class对象 创建class对象的三中方法 1.通过类名:类名.class 2.通过对象 ...下图中是:通过反射获取私有的成员变量和成员方法的代码步骤 ... -
php关于private、public成员变量访问问题
2021-04-21 15:40:55如果类里面定义了__get($name)方法,则不论类的private成员还是public成员,都能够在类的外面通过类似$...如下例,由于访问的成员变量是private变量,因此底层会通过调用get方法获取该变量。class Page {private $p... -
javascript - 请问JS私有变量为何无法访问?
2021-04-13 14:34:23function 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语言中结构体变量私有化详解
2021-05-20 13:22:22C语言中结构体变量私有化详解背景介绍操作系统 : CentOS7.3.1611_x64gcc版本 :4.8.5什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以... -
类的私有成员可在何处访问
2021-02-28 17:06:54类的私有成员可在本类的成员函数中进行访问。...如果要在其他类中获得私有成员变量,那么可以在本类中写一个public的get方法,其他类就可以通过调用这个get方法获得私有成员变量。class PrivateTes... -
PHP-private私有访问的操作方法
2021-03-24 12:30:50实例classGirlFriend{//定义一个女朋友类/*类中的成员{属性(变量)---静态描述:姓名、性别、年龄、身高、体重、三维方法(函数)---动态描述:说话、奔跑、可以生孩子、洗碗、}*///--------------------------start---... -
php怎么把局部变量变成全局变量
2021-03-26 12:37:11php怎么把局部变量变成全局变量1. php 局部变量如何访问全局变量$arr = array( 0,1,2,3 );function tojsarr(){global $arr; // 调用全局变量return json_encode( $arr );}?>js_arr = ... -
子类为什么可以访问父类的私有方法
2021-03-24 10:51:22你是通过公有的方法去访问私有的方法,这是可以的 public void hello() 是公有方法 它是允许调用本类的私有方法 依照你上述的例子并不能说子类能访问父类的私有方法。因为hello本身就是父类的方法。 如果子类是这样... -
【短文】为什么我不在PHP的私有变量用下划线了?
2021-03-26 11:38:29类似这种关于代码规范的问题,目前我的观点是:跟随你面对的团队,跟随你面对的代码块最近两次被别人问到php私有变量加下划线的问题,由于我开始也是这么做的,但是最后还是没用下划线了。最后想想还是把自己的想法说... -
php怎样定义全局变量?
2021-03-22 19:47:47Global是php中一个比较特殊的命令,大家直接叫他超级全局变量了,下面我来介绍我今天在使用Global定义全局学习笔记了很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就是无法相互访问。比如下面... -
私有属性方法
2021-04-26 14:21:491. __set() 方法用于设置私有属性值。2. __get() 方法用于获取私有属性值。3. __isset() 方法用于检测私有属性值...虽然可以将对属性的访问写成一个方法来实现,但 PHP 提供了一些特殊方法来方便此类操作。__set()... -
php 给对象私有及受保护的成员变量赋值的几种方法
2016-07-10 13:47:25<?php class City{ private $_cityName; private $_population; //function city($_cityName,$_population){} php5.3.3起在有命名空间的类中,类同名方法不再视为构造方法而是常规方法,无命名空间类中不影响 ... -
教你如何直接访问php实例对象的private属性
2021-03-23 14:18:10在介绍关键部分之前,我们先回顾一下php面向对象的访问控制。对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被... -
[php中的静态变量]php静态变量常见的方法_php静态变量有什么方法
2021-03-23 15:06:37php静态变量方法1、静态全局变量定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。特点:A、该变量在全局数据区分配内存。B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动... -
4.level4-[本地复现]-[伪变量$this访问类方法中隐藏的成员变量]-[私有和保护属性的序列化]
2021-12-27 22:02:35文章目录PHP反序列化漏洞level4-[本地复现]-[伪变量$this调用私有属性]-[私有和保护属性的序列化]1.题目描述2.代码审计3.解题过程4.总结 PHP反序列化漏洞 level4-[本地复现]-[伪变量$this调用私有属性]-[私有和保护... -
在PHP中从类外部调用私有方法和私有属性
2021-03-25 11:15:28我想在非常罕见的特定情况下从类外部访问私有方法和变量.我已经看到尽管使用了内省,但这是不可能的.具体案例是下一个案例:我想要这样的东西:class Console{final public static function run() {while (TRUE != ... -
公共,私有和受保护的有什么区别?
2021-04-26 11:30:36什么时候以及为什么应该在类内使用public , private和protected函数和变量? 它们之间有什么区别?例子:// Publicpublic $variable;public function doSomething() {// ...}// Privateprivate $variable;private ...