PHP面向对象编程学习之对象基础
php虽然是一门学习起来非常简单的语言,但是这门语言也包含了对面向对象编程的支持。尤其是随着php5的发布,php对面向对象的支持有了很大的进步。最近学习了一下php的面向对象编程,不禁感慨,面向对象真的是一种非常优雅的编程,最主要的是真的很难!
学习面向对象,当然首先就要了解什么是类,什么是对象,类和对象有什么关系?类和对象的定义就不在这里赘述了,相信大家对类和对象都有一个基本的认识。还是主要说一下类和对象的关系:类是用于生成对象的模板,而对象是类的实例。如何定义类和实例化对象就不多说了,这都是非常简单的操作。下面简单记录一下面向对象的几部分吧(很多是自己在学习时的理解,有不对的地方请大家批评教育!)。
(1)设置类的属性:大家对类有了基本的认识后就会知道,不同的类具有不同的属性,举个例子就像商品类,商品具有价格属性。定义类的属性其实和定义变量个人看来没有什么太大的区别,比较特别的就是在定义属性时,需要给类的属性一个可见性的关键字,这个可见性的关键字就决定了这个属性什么时候可以被访问。可见性关键字有:public、private、protect,如果使用var来定义,则默认为public。
<?php
header("Content-type: text/html; charset=utf-8");
class Product{
public $name="衬衫";
public $price=100;
} $product1=new Product();
echo $product1->name;
?>
在上述代码中,首先设置了页面编码格式为utf-8,然后定义了一个Product类,这个有两个属性:name、price,并且这两个属性都是public,运行这段代码将输出“衬衫”。
在php中还有一种动态增加属性的操作,$product1->haha="哈哈",直接用已经实例化的方法访问一个不存在的属性并且赋值的方法动态增加属性,这种动态增加属性有一个很大的缺点就是在用类实例化对象时,无法保证其它对象也有这个属性。
(2)类中使用方法:使用方法就是在类中声明类有可能用到的函数,方法声明和函数声明差不多,在方法声明时需要在方法的前面加上一个可见性的关键字,因为可见性关键字的限制,使得方法可以在不同的地方被访问。在类中声明了方法以后,我们可以直接实例化一个对象,然后用对象去访问这个方法即可。
<?php
header("Content-type: text/html; charset=utf-8");
class Product{
public $name="衬衫";
public $price=100; public function say(){
return $this->price;
}
} $product1=new Product();
echo $product1->name."<br>";
echo $product1->say();
?>
上述代码执行后将会在浏览器输出:“衬衫”,下一行“100”。其实$this是一个伪变量,表示当前对象,注意,表示的是当前对象,而不是类。
在类的方法中一个比较重要的方法就是构造函数(也叫作构造方法),构造方法的作用就是在创建对象时被自动调用,用于对象的实例化。在php5后,推行的构造函数的命名为__construct(),当我们使用new操作符实例化对象时,构造方法被自动调用,根据参数去实例化类中的属性,达到对对象的初始化。(其实个人觉得这种构造方法,只是提供一个自动调用机制,当我们在初始化时,自动调用构造函数,并且传入参数,根据传入的参数初始化类中成员属性)
<?php
header("Content-type: text/html; charset=utf-8");
class Product{
public $name;
public $price; public function __construct($name,$price){
$this->name=$name;
$this->price=$price;
} public function say(){
return $this->price;
}
} $product1=new Product("衬衫",100);
echo $product1->name."<br>";
echo $product1->say()."<br>";
$product2=new Product("牛仔裤",200);
echo $product2->say();
?>
上述代码执行后会在浏览器中输出“衬衫、100、200”。
(3)继承:继承是从一个基类得到一个或者多个派生类的机制,子类通过对父类的继承,在获取父类属性和方法的通过,还可以通过“扩展”来扩展自己特有的属性和方法。继承的创建个人认为需要如下步骤,1、从现有基类中分离出不适合放在一起或者需要特殊处理的类方法 2、以我们所分离的为基础创建出派生类,创建子类时需用到关键字extends。 3、因为不同的子类的特有属性肯定不相同,所以我们应该构建子类自己的构造方法和类方法。在构建自己特有的构造函数时,可以使用::来访问父类的构造函数,在自己的构造函数中初始化自己特有的属性。
基类:
<?php
class ShopProduct{
//定义私有的属性
private $title;
private $producterMainName;
private $producterFirstName;
private $price;
private $$discount=0; //定义构造函数
public function __construct($title,$firstName,$mainName,$price){
$this->title=$title;
$this->producterFirstName=$firstName;
$this->producterMainName=$mainName;
$this->price=$price;
} //定义对私有属性进行访问的方法
public function getProducterFirstName(){
return $this->producterFirstName;
}
public function getProducterMainName(){
return $this->producterMainName;
}
public function getDiscount(){
return $this->discount;
}
public function getTitle(){
return $this->title;
}
public function getPrice(){
return ($this->price-$this->discount);
} //定义对私有属性进行操作的方法
public function setDiscount($num){
$this->discount=$num;
} //定义类中的一般方法
public function getProducer(){
return "{$this->producterFirstName}"."{$this->producterMainName}";
}
public function getSummaryLine(){
$base="{$this->title}({$this->producterMainName},";
$base.="{$this->producterFirstName})";
return $base;
}
}
?>
子类:
<?php
require_once("phpClassShopProduct.php");
class BookProduct extends ShopProduct{
//定义子类特有的私有属性
private $numPages=0; //定义构造函数
public function __construct($title,$firstName,$mainName,$price,$numPages){
parent::__construct($title,$firstName,$mainName,$price);
$this->numPages=$numPages;
} //定义子类的特有方法
public function getNumOfPages(){
return $this->numPages;
}
public function getPrice(){
return $this->price;
} //覆写父类已有的方法
public function getSummaryLine(){
$base=parent::getSummaryLine();
$base.=":page count-{$this->numPages}";
return $base;
}
}
?>
从以上代码中,可以看出通过对象的继承写出的代码非常的整洁,有层次。通过继承,大大提高了我们代码的重用性。
自己学习后写的一点东西,记录一下,都是自己的理解,如果哪里有错误,希望大家指出,感激不尽!
PHP面向对象编程学习之对象基础的更多相关文章
- Python记录14:面向对象编程 类和对象
'''现在主流的编程思想有两种,一种是面向对象,一种是面向过程面向过程编程 核心是过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.最后干什么... 基于该思想编写程序就好比再设计一条流水线, ...
- php面向对象编程学习之高级特性
前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...
- 13_Python的面向对象编程-类class,对象object,实例instance
1.面向对象概述 1.类是用来描述对象的工具,把拥有相同属性和行为的对象分为一组 2.对象是由类实例化出来的一个具体的对象 属性: 对象拥有的名词,用变量表示 ...
- JavaScript学习笔记——对象基础
javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研 ...
- Python之面向对象编程学习
不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- JavaScript面向对象编程学习笔记
1 Javascript 面向对象编程 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例 ...
- 04面向对象编程-01-创建对象 和 原型理解(prototype、__proto__)
1.JS中对象的"不同":原型概念 从Java中我们可以很好地去理解 "类" 和 "实例" 两个概念,可是在JavaScript中,这个概念 ...
随机推荐
- Missing Number, First Missing Positive
268. Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find th ...
- VC ++ 后台消息模拟
HWND TO=; //TO=::FindWindow(_T("Chrome_RenderWidgetHostHWND"),NULL); TO=::FindWindow(_T ...
- Android Studio 实时显示布局文件Preview窗口
Android Studio的功能包含preview窗口, 可以查看布局(layout)的样式; 位置:app->src->main->res(资源)->layout(布局), ...
- C Traps and Pitfallss
第一章 词法“陷阱” 发送阿罡发公司阿发送个发送阿罡发公司阿发送个 第二章
- 自动注册服务NET Core扩展IServiceCollection
NET Core扩展IServiceCollection自动注册服务 前言 在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中, ...
- Delphi 实现无窗口移动(发WM_NCHITTEST消息计算,然后再发WM_SYSCOMMAND消息,带参数SC_DRAGMOVE)
procedure imgListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) ...
- 普里姆(Prim)算法
/* 普里姆算法的主要思想: 利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录 */ # include <stdio.h> typedef char Ve ...
- Advanced Fruits(好题,LCS的模拟)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Objective-C 内存管理之 _ARC
内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...
- Ibatis代码自动生成工具——Abator安装与应用实例(图解)
Abator 能自动生成DAO,DTO和sqlMap,大大提高开发效率.Abator 的官方网站:http://ibatis.apache.org/ibator.html 使用也比较简单,以下做个实例 ...