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中,这个概念 ...
随机推荐
- codevs1304 拓扑序计数
题目描述 Description 求一颗有根树/树形图的拓扑序个数. 输入描述 Input Description ...
- EC读书笔记系列之18:条款47、48
条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...
- mysql5.6 zip版安装
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- linux 下idea 启动tomcat报JMX 1099错误解决办法
开始使用linux开发环境,在配置idea 下tomcat 启动时报错,提示错误为unable to ping server at localhost:1099. 解决办法: 修改/etc/hosts ...
- Gesture(手势)浅析
1.Gesture的作用 ①在触摸屏上的连续触摸行为,形成某个方向上的移动趋势 (利用手势检测) ②连续画出一个不规则的行为 (利用增加手势) 2.手势检测(GestureDetector) // ...
- 指定端口号,多线程扫描局域网内IP地址
小白第一次发博客,请各路大神不要喷,有错的地方还请不吝啬指教,谢谢....... 因为注释基本上已经说清楚啦,在这里就不多说什么啦,知识不够怕误人子弟 # -*- coding:utf-8 -*-im ...
- Best Financing(HD4833)
每笔收入产生的收益是独立的. 计算所有点的收益率,累计. #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<al ...
- Oracle 11g R2安装手册(图文教程)For Windows
1.Oracle 11g R2安装手册(图文教程)For Windows 1.下载Oracle 11g R2 for Windows版本,下载地址如下 官方网站: http://download.or ...
- bash快捷建-光标移到行首、行尾等
转自:http://digdeeply.org/archives/12131599.html ctrl键组合ctrl+a:光标移到行首.ctrl+b:光标左移一个字母ctrl+c:杀死当前进程.ctr ...
- Oracle EBS-SQL (WIP-6):检查任务已完成但状态是发放的任务.sql
select WE.WIP_ENTITY_NAME ,MSI.SEGMENT1 ,MSI.DESCRIPTION ,WDJ.CLASS_CODE ...