4月26 关于类,对象以及面向对象三大特性之封装

---恢复内容开始---

<?php
//面向过程
比如求一个圆的面积
$r=5;
$m=3.14*$r*$r;
//当直接规定半径时这是很方便的但是当变量改变时会出现代码的重复
?>
类和对象
对象:能够见到的任何东西都可以称为对象, 也可以理解为类实例化出来的东西
类: 对所有同类的对象抽象出来的东西

举例理解类和对象:

类:比如班级里面每个人相同的有学号,上课时间,休息时间,所上课程等;再比如说人所共有的姓名,性别,年龄等等,这些所公有的都可以统称为类;就像数据库没给表的第一行

对象:具体到一条具体的信息 比如:p001,张三,男,汉族,1990-2-9等
拿老师所讲的粉笔打比方:一盒粉笔的所有公有的会有颜色,长度等称为类,拿出一只粉笔是它的颜色长度是对象的信息

<?php
//定义类 不成文规定类的首字母必须要大写

class Ren
{
    var $name;
    var $age;
    var $sex; //成员变量
    var $nation;
  //var $sex =‘男‘; //没有错但是没有意义
    function Run() //成员函数(方法),c#中有成员属性但现在没有
  {
    echo "这个人正在跑步";
   }
    function Say()
   {
      echo "这个人正在说话";
   }
}

使用类
//1.实例化对象 类不能直接使用
$r = new Ren(); //初始化,从大类中新造一个人出来
var_dump($r); //简单的使用,里面没有任何信息

//2.给成员变量赋值 (调用成员变量)
$r->name = ‘张三‘; //给对象的name赋值,不加后面等号是取值
$r->age = ‘23‘; //同理
echo $r->sex ;//不可以会出错,因为对象不属于类
//var_dump($r);

//3.调用成员方法
$r->Run(); //执行成员方法
$r->Say();

?>

访问修饰符
var 是任意类型的,
1.如果需要加访问修饰符,需要去掉var
2.共有三种public 代表公有的, protected 代表受保护的,只能在类和其子类中 private代表私有的只能是在类中使用别的不能
3.如果不加访问修饰符默认公有的

class Ren
{
public $name;
protected $age;
private $sex;
var $nation;
//var $sex =‘男‘; //没有错但是没有意义
function Run()
{
echo "这个人正在跑步";
}
function Say()
{
echo "这个人正在说话";
}
}
$r = new Ren();
$r->name = ‘张三‘;
$r->age =‘20‘; //出错
$r->sex =‘男‘; //出错
var_dump($r);

?>

$this 引用
this 是代表该对象的,也就是张三,那个对象调用就是代表谁,

$this 代表该对象,(哪个对象调用),不代表该类

<?php

class Ren
{
public $name;
protected $age;
private $sex;
var $nation;
//var $sex =‘男‘; //没有错但是没有意义
function Run() //成员函数(方法),c#中有成员属性但现在没有
{
echo "这个人正在跑步";
}
function Say()
{
echo $this->name."正在说话";
$this->Run();
}
}
$r = new Ren();
$r->name = ‘张三‘;
$r->Say();

?>

构造函数 可以写也可以不写
对类进行实例化的时候通过编译,造类时有构造函数不过被隐藏了,看不到的默认的
c#是:public Ren(){}必须与类名相同
特殊性写法特殊固定的两个下划线__construct()
执行特殊,在造对象的时候最先执行,在new时自动执行
作用:对对象执行初始化操作,

<?php

class Ren
{
public $name;
protected $age;
private $sex;
var $nation;

function __construct($s) //构造函数的写法
{
$this->nation = $s;//初始化sex,造对象执行 ,初始化时给参数
}

function Run()
{
echo "这个人正在跑步";
}
function Say()
{
echo $this->name."正在说话";

}
}
$r = new Ren("汉族");
var_dump($r);

?>

以上是上午讲课的内容,下午主要是对析构函数,以及封装进行了较为全面的讲解,理解有些难度
,会慢慢的整理老师所讲的内容

析构函数

析构函数不需要任何的参数,php将在对象被销毁前自动调用这个方法
写法是固定的__destruct(),是自动执行,对象销毁前

<?php
class Ren
{
              public $name;
              public $sex;
              public $age;
              function __construct($s) //构造函数
            {
                  $this->sex =$s;
            }
             function Say()
           {
                echo "好好说话";
           }

function __destruct() //析构函数,对象销毁前执行
        {
                echo "该对象被销毁了";
         }
}
              $r = new Ren("男");
              $r->name ="张三";
              $r->Say();//方法执行完面临销毁时自动执行destruct,不需要调用
?>

面向对象的三大特效:封装,继承,多态
封装
目的:让类更安全,不让外界直接访问类里面的成员变量
做法:1.把成员变量变成私有的 privat
        2.做一个方法来实现变量的取值或赋值,在方法里面加限制条件方法

<?php

class Ren
{
              private $name;
              private $sex;
              private $age;
              function __construct($s) //构造函数
             {
                       $this->sex =$s;
              }
             function Say()
             {
                   echo "好好说话";
              }
                 function SetAge($a)//给age赋值的函数,是需要参数的
          {
                   if($a>10 && $a<50)//给$a限制的条件,若是超出范围为null赋值没有成功,条件范围内可以
               {
                     $this->age = $a;
                }
        }
               function GetAge()//取age的值的方法
             {
                      return $this->age;
              }
}
$r = new Ren("男");
$r->SetAge(30);//只是简单的将age进行了赋值,但还没有控制范围,那时候要用if

echo $r->GetAge();//赋值之后才可以取值,
var_dump($r);

?>

以上只是实现了对于age的封装,如果每个变量都那样的话会工作量较大代码较多,不易操作

使用类里面提供的魔术方法也可以实现对私有成员的操作
__set()特点:会自动执行,把赋值语句中的变量名作为第一个参数,把变量值作为第二个参数调用

__set方法

__get()特点:会自动执行,把取值语句中的变量名作为参数调用__get方法

对类里面的私有成员进行赋值的魔术方法__set(),需要参数的

<?php

class Ren
              {
                        private $name;
                        private $sex;
                        private $age;
                        function __construct($s) //构造函数
                      {
                              $this->sex =$s;
                      }
                       function Say()
                       {
                              echo "好好说话";
                       }
                        function __set($name,$value) //对类里面的私有成员进行赋值的魔术方法__set()
                     {
                         //echo $name;//输出age,说明name就是age;下面调用的是谁输出的就是谁,可以取到变量名

if($name == "age")
                       {
                                if($value >10 && $value <50)
                              {
                                       $this->$name =$value;
                               }
                        }
                                    else
                        {
                                     $this->$name =$value;
                          }
                    }
                                     function __get($name)//对类里面的私有成员进行取值的魔术方法
                           {
                                            return $this->$name;
                            }
                  }

$r = new Ren("男");

//$this->变量名 = $value;
$r->__set("name","张三");//这样是可以的但是需要每一次都要求去写set方法和变量名
$r->name ="李四";//会自动调用__set()方法的,,,执行该语句会自动调用__set方法 讲没有set

方法执行会报错
$r->sex ="女";//__set()之所以称为魔术方法是因为每一个成员变量都可以使用,,,,,echo $name

使用看谁的名字
$r->age =40; //echo $name使用看谁的名字
var_dump($r);

echo $r->sex;//__get()的,不然把__get注释会不可以报错的
echo $r->age;//上面set赋值后,取值

?>

自己瞎琢磨的有点问题

<?php

class Ren
{
private $name;
private $sex;
private $age;
function __construct($s) //构造函数
{
$this->sex =$s;
}
function Say()
{
echo "好好说话";
}
function __set($a,$value) //对类里面的私有成员进行赋值的魔术方法__set()
{
$this->$a= $value;
}
}

$r =new Ren("男");
$r ->__set("a","19");//产生一个新的变量$n 张三, 使用时变量名最好是成员变量里面的
//$r->name ="李四";//会和之前一样的结果没有影响
var_dump($r);

---恢复内容结束---

时间: 2024-12-10 18:17:42

4月26 关于类,对象以及面向对象三大特性之封装的相关文章

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

面向对象三大特性之封装与多态

一 .封装 最主要的作用:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装原则 将不需要对外提供的内容都隐藏起来 把属性都隐藏,提供公共方法对其访问 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self):

Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合

1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对象的引用计数被加上1,此时如果该对象被释放,内存管理程序将首先把该对象的引用计数减1,然后判断该对象的引用计数是否为0,由于其它对象在持有该对象时将引用计数加了1,所以此时该对象的引用计数减1后不为0,则内存管理程序将不会释放该对象.直到持有该对象的其它对象也被释放时,该对象的引用计数再次减1,变为

C# 面向对象三大特性:封装、继承、多态

面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分. 1.封装 每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码.使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些

Python面向对象三大特性之封装

面向函数的编程和面向对象编程对比 vim day7-2.py #!/usr/bin/python # -*- coding:utf-8 -*- def Bar(): print 'Bar' def Hello(name): print 'I am %s' %name class Foo: def Bar(self): print 'Bar' def Hello(self,name): print 'I am %s' %name Bar() Hello('liuyueming') obj = Fo

java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍

封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员. 3.封装的基本要求是:把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数.在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的. 继承: 1.目的:实

java面向对象三大特性之封装

 其实以前一直在做Java开发的过程中或者刚开始初学的时候没有想那么多,都是单纯的一直去做,但是自从做了某个项目之后也慢慢发现很多时候,人的精力和脑力是有限的,总是会忘记以前做过或者学过的东西,慢慢就开始了写博客的习惯,一是可以自己加强一下,二是可以分享给别人可以和大家一起讨论一下,因为每个人的见解都会让你从中获得不同的东西,就想以前遇见的一个老师一样,他说他每讲一次讲面向对象都有着不同的感觉,所以也是对自己和还奋斗在一线程序员的一种鼓励吧,希望多少年后的我们回想起来,我们曾经也是那么的拼过.

15:面向对象三大特性(封装、继承、多态)之多态

本小节知识点: [了解]什么是多态? [掌握]多态的条件 [了解]多态的优点 1.什么是多态? 什么是多态:多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->高级动物 女人 : 女人 -->人 -->高级动物 程序中的多态:父类指针指向子类对象 2.多态的条件 有继承关系 子类重写父类方法 父类指针指向子类对象 狗 *g = [狗 new]; 动物 *a = [狗 new]; 猫 *c = [猫 new]; 动物 *a

面向对象三大特性(封装,继承,多态)之多态

在面向对象语言中,接口的多种不同的实现方式即为多态. 多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. 最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法.如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数. 来说说多态,多态的一大好处是大大简