php - 我对访问 php 中的类以在 OOP 中回显数据感兴趣?
问题描述
在面向对象编程中,如何在 php 中的类中回显数据?如果它是正确的,这是我正在编写的以下代码。每当我回显它时,我都会遇到意外的“$name”期望函数错误:
class person{
$name;
$email;
}
$person1-> new person;
$person1-> $name='Eliot';
echo $person1->$name;
解决方案
首先,你的代码语法错误,试试这个:
<?php
class person{
private $name;
private $email;
}
$person1 =new person;
$person1->name='Eliot';
echo $person1->name;
如果你执行代码,你会得到一个错误:
致命错误:未捕获的错误:无法访问私有财产 person::$name in [...]
这意味着,属性名称不可访问。你必须添加getter和setter。
最好的方法是使用魔术方法 __get和__set,所以你的代码看起来像:
<?php
class person{
private $name;
private $email;
public function __get($property){
return $this->$property;
}
public function __set($property, $value){
$this->$property=$value;
}
}
$person1 =new person;
$person1->name='Eliot';
echo $person1->name; // output Eliot
为了解释更多,一般来说,在所有其他语言上,如果您将属性声明为私有或受保护,则必须声明 get 和 setter 才能访问这些变量,除非不是公共的。所以请看下面的例子:
class person{
private $name;
public function getName(){
return $this->name;
}
public function setName($newname){
$this->name=$newname ;
}
}
$person1 =new person;
$person1->setName('Eliot');
echo $person1->getName(); // output Eliot
这是一种优于其他语言的常用方法,但在 PHP 中,还有另一种方法可以做到这一点,如果你问我这种方法可以帮助我们什么,而不是常用方法。我可以告诉你一个例子,如果你有一个有 10 个私有属性的类,你必须创建 10 个 getter 和 10 个 setter(这是常见的方法),但是在 php 中使用魔法方法,你只需要创建一个 getter __get和一个 setter __设置。(在这里查看更多魔术方法)
这是秘密:
$person = new Person();
$person->$name = "Denba";
后面,PHP知道你要设置对象person的属性名,就像你做的那样
$person->setName('Denba');
所以,因为类的所有属性只有一个 setter,所以你的 __set 方法应该有你想要更新的属性作为参数,然后是你想要放入的值。
还有另一个问题,如果你问我如果我尝试更新一个不存在的属性会怎样:
$person->xxx = "Denba"; // xxx does not exist on the class
这不会破坏您的脚本,如果您尝试访问:
$person->xxx // this will return Denba
一种在更新属性是否存在之前验证的干净方法,您可以将__set更新 为:
public function __set($property , $value){
if(property_exists($this, $property)){
$this->$property = $value;
}
}
__get :
public function __get($property){
if(property_exists($this, $property)){
return $this->$property;
}
}
希望这对您有所帮助。
享受伟大的 PHP 。
推荐阅读
- html - 如何组织卡片组
- python - 从记录列表中过滤单元:BS4 Python
- docker - Docker .exe 甚至不会在 w10 企业版上启动
- javascript - 在应用程序外部调用路由更改(react-router)
- asp.net - 如何访问在 localhost (IIS) 上运行的 ASP.NET Web api
- redux - 如何检查用户是否登录过一次?
- regex - python正则表达式从字符串中删除特定的sub_string
- javascript - 将 Vue.js appstate 保存到本地存储的最佳事件
- windows - 在 Windows 2012 R2 Server 的 Hyper-V 上运行 Ubuntu 18.04 时出现黑色矩形并部分混淆桌面
- karate - 空手道 API 测试 - API 响应数组上的数值验证