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;
    }
}
?>

从以上代码中,可以看出通过对象的继承写出的代码非常的整洁,有层次。通过继承,大大提高了我们代码的重用性。

自己学习后写的一点东西,记录一下,都是自己的理解,如果哪里有错误,希望大家指出,感激不尽!

时间: 2024-10-07 19:58:38

PHP面向对象编程学习之对象基础的相关文章

黑马程序员-Java面向对象编程学习总结

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java面向对象编程学习总结: 重要知识点总结如下: 1,抽象,封装,继承,多态是面向对象程序设计中得四个特点. 2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现. 可概括为如下过程:分析用户需求,从问题中抽

JavaScript学习笔记——对象基础

javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研究的任何事物,不仅能表示具体事物,还能表示抽象的规则,计划或事件. 属性的无序集合,每个属性可以存一个值(原始值,对象,函数) B.对象的属性和行为 属性:用数据值来描述他的状态 行为:用来改变对象行为的方法 C.类 具有相同或相似的性质的对象的抽象就是类.对象的抽象,就是类,类的具体化(实例化)

面向对象编程?没有对象你编毛程序!!!

听说你们程序员都是面向对象编程?你没有对象编毛程序!!! 程序员打油诗 写字楼里写字间,写字间里程序员; 程序人员写程序,又拿程序换酒钱. 酒醒只在网上坐,酒醉还来网下眠; 酒醉酒醒日复日,网上网下年复年. 但愿老死电脑间,不愿鞠躬老板前; 奔驰宝马贵者趣,公交自行程序员. 别人笑我忒疯癫,我笑自己命太贱; 不见满街漂亮妹,哪个归得程序员.       程序猿最怕弹出的窗口:"找不到对象.指针为空" 这辈子做程序员的命 宝宝数学很好,2岁就可以从1数到10了.后来,我告诉他0比1还小.

面向对象编程(OOP)基础知识(一)

Java是一个支持并发.基于类和面向对象的计算机编程语言. 下面列出了面向对象软件开发的优点: 1.代码开发模块化,更易维护和修改. 2.代码复用. 3.增强代码的可靠性和灵活性. 4.增加代码的可理解性. 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会逐个分析这些特性. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在Java当中,有3种修饰符:public,private和protected.每一种修饰符给

PyTorch框架+Python 3面向对象编程学习笔记

一.CNN情感分类中的面向对象部分 sparse.py 1 super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义初始化 1 self.weight = Parameter(torch.Tensor(num_embeddings, embedding_dim)) Parameter跳转 1 class Parameter(Variable): 2 """A kind of Variabl

《Python核心编程》 面向对象编程学习笔记

1. 1. 引言 1. 类与实例 可以定义一个本身没有任何属性的类,而仅把它用做数据的名字空间,这样的类仅作为容器对象来共享名字空间. 示例如下: class MyData(object): pass 下面创建它的实例,它只使用类作为名称空间容器. >>> mathObj = MyData() >>> mathObj.x = 4 >>> mathObj.y = 5 >>> mathObj.x + mathObj.y 9 >>

JavaScript面向对象编程学习笔记

1  Javascript 面向对象编程 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. 自动含有一个constructor属性,指向它们的构造函数. Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系. Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象.这个对象的所有属性和方法,都会被构造函数的实例继承.

PHP面向对象编程学习之一

继承 1.父类里面定义的类成员可以不用在子类中重复定义,节约了编程时间和代价 2.同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用他们的时候可以一视同仁. 3.子类可以修改和调整父类定义的类成员 <?php class Animal { private $weight; public function getWeight() { return $this->weight; } public function setWeight($w) { $this->weight = $w

Day16:面向对象编程——类和对象

一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象.程