- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
PHP是一个面向对象的编程语言,那么什么是面向对象呢?我们为什么要面向对象呢?在我们的生活中有很多事物都是对象,比如一个杯子,一个盒子等,它们都有自己特有的特征,它们都是对象。而我们在开发中的开发也是面向对象编程的。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象。我们使用面向对象编程可以使我们看问题能够看得全面,同时也有利于与数据的管理和维护,在PHP中面向对象可以分文两类,一类是模子,创造对象使用,一类是对象,使用模子创建的起来的,那么它们两个有什么关系呢?
类与对象:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
也就是说把对象的功能和特征抽取出来,组成一个类,就好比把一个杯子的模型抽取出来,而我们可以根据这个模型(也就是类)去创建各种杯子(也就是对象)。
那么类是怎么定义的呢?对象又是怎么创建的?
<?php
class Cat{ //定义一个猫类
public $name; //猫的名字
public $age;//猫的名字
public $color;//猫的颜色
//猫的构造方法
public function __construct(){
}
public function sleep(){
echo '猫睡觉';
}
public function eat(){
echo '猫吃饭';
}
}
上面的就是一个类的基本结构,下面我们详细的讲解每个部分的意义。
属性: 成员属性是类的一个组成部分,一般是基本数据类型(整数,字符串等),也可是复合类型(对象、数组) , 资源类型。比如我们前面定义猫类的public $age 就是成员属性。
可以说每个类都有属性,类的属性是一类的特征,比如说猫可以有名字,年龄,颜色等,这些猫类共有的特征。在类中这种特征我们称之为属性,当然我们也可以不定义属性。这个看自己的需求。
属性前面的public是一个权限修饰符,在后面会有讲解。
在上面的代码中可以看到在类中还有几个函数,它们和前面的函数是一样的,不过是前面多了一个权限控制符。也可以叫做成员方法,这些成员方法就是类中的行为动作,比如上面的猫类,有睡觉这个行为,也有吃饭这个行为,当然你可以自己写它有什么行为。
成员方法的语法:
访问修饰符 function 函数名(形式参数){
//函数体;
//return 返回值;
}
上面的猫类中有一个方法,方法名是—__construct(),这是个构造函数,那么什么是构造函数?构造函数就是在创建对象的时候,进行初始化数据的方法,比如我们想在创建猫类对象的时候,直接把猫的名字、年龄和颜色给它,就可以使用到构造函数。
public function __construct($name,$age,$color){
$this-> name = $name;
$this-> age = $age;
$this-> color = $color;
}
构造函数的语法是:
public function __construct(形式参数){
//函数体
}
对于构造函数的方法名__construct(),这个是一个魔术方法,在后面有介绍,其实构造函数还有一种写法,构造函数的方法名是类的名字:
public function Cat($name,$age,$color){
}
上面的构造方法定义方式也是正确的,但是推荐使用魔术方法的那一种(__construct()),以为这样当我们的类名发生改变的时候,不用修改。
注意PHP中类的名字不区分大小写,但是我们还是要按大小写来写。同时构造函数是没有返回值的。
构造函数需要注意的是:
上面的三种情况就是类中大致的内容,在后续我们还会降类中的其他情况。
在上面创建对象的类已经有了,那么怎么创建对象呢?
$cat = new Cat();
创建对象的语法是:
$对象名 = new 类名(参数1,参数2);
类名后面的括号里的参数是传递给类的构造函数的,如果构造函数没有参数,可以不写。
我们创建对象的目的就是需要操作对象,而操作对象,就是操作对象里面的属性和方法。
在上面的类下面写如下代码:
//创建对象,传递三个参数到构造函数。
$cat = new Cat('小花',12,'black');
//通过对象来访问对象的属性
echo $cat -> name;
echo '<br>';
echo $cat -> age;
echo '<br>';
echo $cat -> color;
echo '<br>';
$cat-> sleep();
$cat-> eat();
.....结果......
小花
12
black
猫睡觉
猫吃饭
上面的对象通过->访问属性和方法。注意属性的前面没有$符号。
$对象名->属性名= 值;
echo $对象名->属性名;
'-> ' 称为对象运算符.
上面的就是对象的创建和最基本的应用
当我们把对象的值赋给另外一个变量是,是值传递还是引用传递?
//创建一个对象
$cat = new Cat('小花',12,'black');
$cat1 = $cat; // 把$cat这个对象赋给$cat1;
$cat1 -> name = '小白';//利用$cat1这个对象修改对象的名字。
echo $cat1 -> name; //输出$cat1对象的名字。
echo '<br>';
echo $cat -> name; //输出$cat对象的名字。
.....结果......
小白
小白
看到这里可能有点蒙,不是值传递吗?怎么修改一个对象的属性,另外一也变了?,
上面的代码当中 $cat1=$cat也是值传递,但是这个值是对象的引用(可以理解对象标识符),即每个包含对象的变量都持有对象的引(reference),而不是整个对象的拷贝。
在上面的图中可以看到,当$cat赋值给$cat1时,也就是对象标识符(#1)复制了一份,赋给$cat1,其实他们还是指向同一块数据区,所以只要其中一个修改了值,另外一个也会变。
我们使用完对象后,已经确定在以后不会使用这个对象了,这个时候我们可以手动的销毁对象,那么我们怎么让对象销毁呢?
//创建一个对象
$cat = new Cat('小花',12,'black');
$cat -> sleep();
unset($cat);
$cat -> sleep();
.....结果.....
猫睡觉
Notice: Undefined variable: cat in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27
Fatal error: Call to a member function sleep() on null in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27
其实在一个文件运行完的时候,PHP会启动垃圾回收机制,自动的进行垃圾回收。这时候在里面创建的对象就自动销毁了,那么什么是PHP的垃圾回收机制?
垃圾回收,顾名思义,回收垃圾的,在程序中启动垃圾回收机制的时机:
那么什么是垃圾回收机制?
垃圾回收机制是php5之后才有的,php5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。但是PHP5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在(对象的相互引用),以避免内存泄漏。
在上面写类的构造函数的时候,可以看到在函数中使用到了$this,那么在面向对象中$this是什么?
$this是在类中使用的访问自身的一种机制。系统会给每个对象分配$this,代表当前对象。通俗的说就是在当前环境下,谁调用,$this就代表哪个对象。
<?php
class Cat{ //定义一个猫类
public $name; //猫的名字
public $age;//猫的名字
public $color;//猫的颜色
//猫的定义方法
public function Cat($name,$age,$color){
$this-> name = $name;
$this-> age = $age;
$this-> color = $color;
}
public function sleep(){
echo '猫睡觉<br>';
}
public function eat(){
echo '猫吃饭<br>';
}
//输出猫的信息
public function info(){
echo '猫的名字是' . $this -> name . ' 年龄是' . $this-> age . ' 颜色是' . $this-> color;
}
}
//创建一个对象
$cat = new Cat('小花',12,'black');
$cat -> info();
echo '<br>';
//创建另一个对象,传进不同的属性
$cat1 = new Cat('小白',6,'white');
$cat1 -> info();
.....结果.....
猫的名字是小花 年龄是12 颜色是black
猫的名字是小白 年龄是6 颜色是white
在上面的类中的info()函数中使用$this,不同的对象输出不同的结果,因为在不同的环境下,谁调用,$this就代表哪个对象。
在上面我们提到过,对象的销毁,其实在类中有一个方法,就是在对象销毁的时候由系统自动执行的。我们称之为析构函数。
public function __destruct(){
echo $this->name . '被销毁了<br>';
}
在PHP5中引入了析构函数的概念,析构函数会在某个对象的所有引用被删除(没有变量指向对象,要被销毁了),对象销毁前执行。
析构函数的主要作用是去释放对象分配的相关资源,比如数据库连接或打开的文件等。
它的语法是:
function __destruct(){
//函数体[释放资源,比如数据库连接,或者打开文件等等]
}
析构函数也是系统自动调用的,我们不用自己调。但是当我们没有写析构函数的时候,系统不会执行析构函数。
<?php
class Cat{ //定义一个猫类
public $name; //猫的名字
public $age;//猫的名字
public $color;//猫的颜色
//猫的定义方法
public function Cat($name,$age,$color){
$this-> name = $name;
$this-> age = $age;
$this-> color = $color;
}
public function sleep(){
echo '猫睡觉<br>';
}
public function eat(){
echo '猫吃饭<br>';
}
//输出猫的信息
public function info(){
echo '猫的名字是' . $this -> name . ' 年龄是' . $this-> age . ' 颜色是' . $this-> color;
}
public function __destruct(){
echo $this->name . '被销毁了<br>';
}
}
//创建一个对象
$cat = new Cat('小花',12,'black');
echo $cat -> name; //输出对象的名字
echo '<br>';
unset($cat); //销毁对象,系统自动调用析构函数。
.....结果......
小花
小花被销毁了
当我们销毁对象$cat时,析构函数自动执行。
当我们一个文件中创建了多个对象,在文件执行完毕,销毁对象的时候,是先创建的对象后销毁,后创建的对象,先销毁,这个原理和栈的原理很想,先进后出,后进先出。
通过上面对类和对象的讲解,我们可以知道类和对象的区别和联系。类是抽象的,代表着一类事物,如猫类。对象时具体的,代表一个具体事物。类是对象的模板,对象是类的一个个实例。同时类的基本构成要掌握。
我在 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
我是一名优秀的程序员,十分优秀!