- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Php可以说是一个面向对象的语言,php的类中有自己独有的一些方法,不同于别的编程语言,php在定义类中除了我们自己定义的属性方法以外,Php还有一写魔术方法,当我们把这些方法写出来后,我们并不需要自己去调用。系统就会在触发某些条件之后自动调用。
注意,当我们没有写这些魔术方法时,系统不会去调用这些魔术方法。
php提供的魔术方法有很多,这里我们只介绍常用的几个。
你会发现这些魔术方法的前面都有两个下划线__这是因为PHP 将所有以\ __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以\ __ 为前缀。
下面我们单个的介绍每个魔术方法是怎么使用的。
__get():读取不可访问或不存在的属性的值时,__get() 会被调用。
__set():在给不可访问或不存在的属性赋值时,__set() 会被调用。
在类中当属性的修饰符是protected和private的时候,在类的外部不能通过对象名的形式进行访问,如果强行读取不可访问的属性,并且你在类的内部写了__get函数,这时候系统就会自动的调用__get魔术方法,当你强行修改不可访问属性值得时候,__set魔术方法就会被执行。
示例:
<?php
class Cat{
protected $name;
protected $age;
protected $sex;
public function __construct($name,$age,$sex){
$this -> name = $name;
$this -> age = $age;
$this -> sex = $sex;
}
//__set方法,可以处理你自己的逻辑
public function __set($name,$value){
echo 'set方法被执行了<br>';
//这里使用这个函数判断当前类中有没有这个属性,防止属性出现null的情况。
if(property_exists($this, $name)){
$this -> $name = $value;
}else{
echo '你要设置的属性不存在';
}
}
//__get方法,可以处理你自己的逻辑
public function __get($name){
echo 'get方法被执行了<br>';
if(isset($this->$name)){
return $this -> $name;
}else{
echo '你要的属性不存在,或者属性值为空';
}
}
}
$cat = new Cat('小花',2,'雌');
echo $cat -> name . '<br>'; //读取不可访问的属性值得时候,get方法被执行
$cat -> age = 5; //修改不可访问的属性值set方法被执行
echo $cat -> age;
property_exists()函数:检查对象或类是否具有该属性
__isset():当对不可访问或不存在属性调用isset() 或 empty() 时,__isset() 会被调用。
__unset():当对不可访问或不存在的属性调用 unset() 时,__unset() 会被调用。
在类的外部对对象的不能访问属性使用isset函数或empty函数的时候或者这个属性在类中都没有定义。魔术方法__isset()就会执行,而进行unset操作是__unset就会自动调用。
示例:
<?php
class Cat{
protected $name;
protected $age;
protected $sex;
public function __construct($name,$age,$sex){
$this -> name = $name;
$this -> age = $age;
$this -> sex = $sex;
}
//__isset方法,在类中可以对类的属性进行判断,并返回。
public function __isset($name){
echo 'isset方法执行了<br>';
return isset($this -> $name);
}
//__unset方法
public function __unset($name){
echo 'unset方法执行了<br>';
if(property_exists($this,$name)){
unset($this -> $name);
}else{
echo '你要销毁的属性不存在';
}
}
}
$cat = new Cat('小花',2,'雌');
echo isset($cat -> name);
unset($cat->age);
echo '<pre>';
var_dump($cat);
__isset():在对象中调用一个不可访问或不存在的方法时,__call() 会被调用。
因为php语言不支持函数的重载,可以使用这个魔术方法进行重载。
示例:
<?php
class Math{
private function add($a,$b){
return $a + $b;
}
private function add1($a,$b,$c){
return $a + $b + $c;
}
//这个魔术方法中有两个参数,第一个参数是传过来的函数名,第二个参数是传过来的方法中的参数组成的数组。
public function __call($method,$arr_value){
if($method == 'add'){
//得到数组的数量,确定使用那个方法。
$total = count($arr_value);
if($total == 2){
return $this -> add($arr_value[0],$arr_value[1]);
}else if($total == 3){
return $this -> add1($arr_value[0],$arr_value[1],$arr_value[2]);
}
}
}
}
$math = new Math();
echo $math -> add(1,2) . '<br>';//私有的方法,没有权限,会调用call方法.
echo $math -> add(1,2,3);
在php中同一类中一定不能有方法名相同的函数。不然后报错。
__clone():可以防止别人克隆我们的对象。
php语言中有一种机制叫做克隆,如果定义了 __clone()方法,则新创建的对象(复制生成的对象)中的 __clone()方法会被调用。
程序员可以通过克隆把对象进行整体的克隆,但是有时我们不希望别人克隆我们的对象,比如单列模式,这时使用克隆可以解决。
示例:
<?php
class Cat{
public $name;
public $age;
public function __construct($name,$age){
$this -> name = $name;
$this -> age = $age;
}
public function showInfo(){
echo '姓名是:' . $name . ' ' . '年龄是:' . $age;
}
private function __clone(){
}
}
$cat = new Cat('小花',2);
echo '<pre>';
var_dump($cat);
$cat2 = clone $cat;
var_dump($cat2);
注意在这里魔术方法的权限修饰符是private,私有的。
__tostring方法用于一个类被当成字符串时应怎样回应。例如 echo $obj;
当我们尝试把一个对象当成字符换进行echo输出的时候,类的tostring方法就会默认被调用,在这个方法中我们可以定义对象应该输出什么。
示例:
<?php
class Dog{
private $name;
private $age;
private $color;
public function __construct($name,$age,$color){
$this -> name = $name;
$this -> age = $age;
$this -> color = $color;
}
//定义tostring方法
public function __toString(){
return '名字是:' . $this ->name . ' ' . '年龄是:' . $this -> age . ' ' . '颜色是:' . $this ->color;
}
}
$dog = new Dog('小白',4,'red');
echo $dog;
注意:在tostring中必须要有一个返回值。
__construct():PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法。
在类中定义构造函数一般是完成创建对象时,对象的初始化。当我们没有定义构造方法的时候,系统会调用他自己默认的构造函数,这个构造函数是一个无参的构造函数。
示例
<?php
class Cat{
protected $name;
protected $age;
protected $sex;
//定义一个构造函数,完成对属性的初始化。
public function __construct($name,$age,$sex){
$this -> name = $name;
$this -> age = $age;
$this -> sex = $sex;
}
}
$cat = new Cat('小白',12,'雄');
echo '<pre>';
var_dump($cat);
__destruct();PHP 5 引入了析构函数的概念,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
析构函数会在函数销毁前执行,在这里面我们可以对用到的资源进行释放,比如数据库。
示例
<?php
class DaoMysql{
protected $link;
public function __construct($host,$user,$pwd){
$this -> link = @mysql_connect($host,$user,$pwd);
}
public function getLink(){
return $this -> link;
}
//析构函数,用来释放数据库资源。
public function __destruct(){
mysql_close($this->link);
}
}
$daoMysql = new DaoMysql('localhost','root','123456');
$sql = 'select * from tb1';
mysql_select_db('test');
mysql_query('set names utf8');
//通过对象的到里面的链接对象。
$res = mysql_query($sql,$daoMysql -> getLink());
echo '<pre>';
while($row = mysql_fetch_assoc($res)){
var_dump($row);
}
//当类中没有析构函数的时候,把对象置为空,下面的获取数据还能执行,
//当类中有析构函数的时候,把对象置为空,下面的获取数据会出错。说明成功的在析构方法中把数据库连接释放掉了。
$daoMysql = null;
$res = mysql_query($sql);
echo '<pre>';
while($row = mysql_fetch_assoc($res)){
var_dump($row);
}
在php中,这些魔术方法大多数都是我们操作不可操作的数据时,系统触发执行。区别于别的语言,也可以说是php的一大特色。(- _ -);
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!