PHP新手之学习类与对象(3)
四、访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。
1、对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
Example#1 声明类成员
<?php
/**
* Define MyClass
*/
class MyClass {
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private'; function printHello() {
echo $this -> public;
echo $this -> protected;
echo $this -> private;
}
}
$obj = new MyClass();
echo $obj -> public; // 这行能被正常执行
echo $obj -> protected; // 这行会产生一个致命错误
echo $obj -> private; // 这行也会产生一个致命错误
$obj -> printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass {
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2'; function printHello() {
echo $this -> public;
echo $this -> protected;
echo $this -> private;
}
} $obj2 = new MyClass2();
echo $obj -> public; // 这行能被正常执行
echo $obj2 -> private; // 未定义 private
echo $obj2 -> protected; // 这行会产生一个致命错误
$obj2 -> printHello(); // 输出 Public、Protected2,但不会输出 Private class Bar {
public function test() {
$this -> testPrivate();
$this -> testPublic();
} public function testPublic() {
echo "Bar::testPublic\n";
} private function testPrivate() {
echo "Bar::testPrivate\n";
}
} class Foo extends Bar {
public function testPublic() {
echo "Foo::testPublic\n";
} private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo -> test(); // Bar::testPrivate
// Foo::testPublic
?>
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。
2、对方法的访问控制
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
Example#2 声明类中的方法
<?php
/**
* Define MyClass
*/
class MyClass {
// 构造函数必须是 public
public function __construct() {
}
// 声明一个 public 的方法
public function MyPublic() {
}
// 声明一个 protected 的方法
protected function MyProtected() {
}
// 声明一个 private 的方法
private function MyPrivate() {
}
// 这个方法也是 public 的
function Foo() {
$this -> MyPublic();
$this -> MyProtected();
$this -> MyPrivate();
}
} $myclass = new MyClass;
$myclass -> MyPublic(); // 这行能被正常执行
$myclass -> MyProtected(); // 这行会产生一个致命错误
$myclass -> MyPrivate(); // 这行会产生一个致命错误
$myclass -> Foo(); // Public、Protected 和 Private 都被调用了 /**
* Define MyClass2
*/
class MyClass2 extends MyClass {
// This is public
function Foo2() {
$this -> MyPublic();
$this -> MyProtected();
$this -> MyPrivate(); // 这行会产生一个致命错误
}
} $myclass2 = new MyClass2;
$myclass2 -> MyPublic(); // 这行能被正常执行
$myclass2 -> Foo2(); // Public 和 Protected 都被调用了,但 Private 不会被调用 ?>
PHP新手之学习类与对象(3)的更多相关文章
- PHP新手之学习类与对象(2)
二.自动加载对象 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表. 在 PHP 5 中,不再需要 ...
- PHP新手之学习类与对象(1)
本文介绍的是PHP程序设计语言中类和对象的基本知识,适合初学者阅读,希望对你有帮助,一起来看. PHP 5 引入了新的对象模型(Object Model).完全重写了 PHP 处理对象的方式,允许更佳 ...
- PHP新手之学习类与对象(4)
五.范围解析操作符(::) 范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员.方法和常量,还可以用于覆盖类中的成员和方法. 当在类的外 ...
- 新手C#类、对象、字段、方法的学习2018.08.05
类:具有相似属性和方法的对象的集合,如“人”是个类. 对象(实例):对象是具体的看得见摸得着的,如“张三”是“人”这个类的对象.(new Person()开辟了堆空间中,=开辟了栈空间,变量P存放在该 ...
- No1_7.类和对象_Java学习笔记
一.面向对象的特点:a.封装:封装是面向对象的核心思想,将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想: 保证了类内部数据的完整性,应用该类的用户不能轻易直接操纵 ...
- 零基础学习python_类和对象(36-40课)
今天我们开始学习面向对象的知识咯,之前我对面向对象也学的懵懵的,因为感觉知道好像又不是特别清楚,接下来我们一起来学习类和对象吧.零基础的课程我都是看小甲鱼的视频学的,没基础的可以去这个网址下载视频学习 ...
- python学习-class对象
# 面向对象 python,java,c## 面向过程 C # 类和对象# 类 类型类别.类别 物以类聚 一类事物# 班级.人类.动物类.车.学生类.老师类.手机.电脑# 统称 == 共同特性# 不具 ...
- java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2
我们继续学习类与对象,上一篇我们定义了 坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...
- java学习-初级入门-面向对象③-类与对象-类与对象的定义和使用1
今天学习类与对象.先大致解释一下类与对象的含义. 对象:object 有物体这一概念,一切皆对象(物体),对象由静态的属性和动态的行为组成. 比如说水杯: 水杯的静态属性:材质,容量,质量,颜色 动态 ...
随机推荐
- C++Builder 中动态数组的使用(转)
源:http://i.cnblogs.com/EditPosts.aspx?opt=1 和AnsiString类型一样,动态数组是为了和DELPHI中的动态数组相兼容而定义,在BCB中,动态数组是用模 ...
- Efim and Strange Grade
Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input standa ...
- android4.0下如何判断手机是否有底部物理按键(menu物理按键)
某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...
- Qt5:窗口居中显示
QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以move((desktop->width ...
- sql server 日期转换函数 convert()
--内容来自:http://hi.baidu.com/muqingz/item/8fb7b3ca8a485b0cac092f7b Select CONVERT(varchar(100), GETDAT ...
- whm 设置共享IP
点击 Main >>Resellers>>resellers centers (manages ressellers center's IP有几个IP代表几个)
- 设置自己Eclipse代码风格(内部)
经过这几次的代码提交,发现很多人的代码风格不够规范.个人认为很有必要强制性规定一下代码的规范. 整体来说,有三种代码风格,其中两种类似于这样的: public void function(){ //f ...
- webapp之路--百度手机前端经验(转)
看了之后收获很大,分享一下: 本文将围绕我半年来在移动前端工程化做的一些工作做的总结,主要从localstorage缓存和版本号管理,模块化,静态资源渲染方式三个方面总结手机百度前端一年内沉淀的解决方 ...
- XPath语法
XPath 是XML 的查询语言,和SQL 的角色很类似.以下面XML 为例,介绍XPath 的语法 <?xml version="1.0" encoding="I ...
- Mysql 技巧
order by条件: SELECT * FROM tablename WHERE id_one=27 OR id_two=27 ORDER BY CASE WHEN id_one=27 THEN t ...