ios重写get set方法属性的set和get方法,怎么写

页面导航:
→ 正文内容 php get set
PHP中__get()和__set()的用法实例详解
在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,对每个字段进行set和get的操作。只需要加上两个魔术方法即可
php面向对象_get(),_set()的用法 一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性。类似于java中的javabean的操作,使用的方法也类似,只是不需要像javabean中那样,对每个字段进行set和get的操作。只需要加上两个魔术方法即可。即私有成员的设值和取值的操作。在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:
代码如下: //__set()方法用来设置私有属性 public function __set($name,$value){ $this-&$name = $ } //__get()方法用来获取私有属性 public function __get($name){ return $this-&$ }
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的,但是如果你在类里面加上了这个方法,在使用“echo$p1-&name”这样的语句直接获取值的时候就会自动调用__get($name)方法,将属性name传给参数$name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上 了,如果没有__set()这个方法,是不允许的,比如:$this-&name=‘zhangsan',这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下:
代码如下: &?php class Person { //下面是人的成员属性,都是封装的私有成员 private $ //人的名子 private $ //人的性别 private $ //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name) { echo "在直接获取私有属性值的时候,自动调用了这个__get()方法&br&"; if(isset($this-&$property_name)) { return($this-&$property_name); } else { return(NULL); } } //__set()方法用来设置私有属性 private function __set($property_name, $value) { echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值&br&"; $this-&$property_name = $ } } $p1=newPerson(); //直接为私有属性赋值的操作,会自动调用__set()方法进行赋值 $p1-&name="张三"; $p1-&sex="男"; $p1-&age=20; //直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值 echo "姓名:".$p1-&name."&br&"; echo "性别:".$p1-&sex."&br&"; echo "年龄:".$p1-&age."&br&"; ?&
程序执行结果: 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接获取私有属性值的时候,自动调用了这个__get()方法 姓名:张三 在直接获取私有属性值的时候,自动调用了这个__get()方法 性别:男 在直接获取私有属性值的时候,自动调用了这个__get()方法 年龄:20 以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
类里的一个属性设置成private加上get.set方法和直接设置成public有什么区别吗,该处理
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口JavaBean如果不涉及到注入、序列化,是不是也不用设计成private-set-get?
爱怎么用怎么用。举一个例子,账户类a包含一个头像,现要将头像单独保持到头像服务器中,如果没有get和set,改的代码量自己想a(id,name,icon)a(id,name)b(id,icon)
'访问器' 仅是一种规范 大家都遵守规范开发 不遵守的后果就是无法使用基于该规范开发的其他类库至于使用访问器的一些'不疼不痒'的好处:1.外部使用者与具体的内部属性解耦 可以更改内部实现不影响外部调用者的行为2.cglib或asm可以在运行期间基于原本的类生成新的类并在访问方法中追加新的实现(动态代理) 而直接访问属性明显不行(比如hibernate的lazy-load)
INTJ 写代码的 啊哈哈哈哈哈OC语法学习小结 - 推酷
OC语法学习小结
1、定义类:
@interface 类名 : 父类
<span style="color:#、使用:(冒号)表示继承一个类
Student : NSObject
<span style="color:#、使用()定义一个Catagory(类别)
* 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法
* 开发工具默认生成的文件为:类名+Catagory名称
* Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定。
<span style="color:#、使用&&表示实现一个Protocol(协议),如需实现多个协议,将协议名以逗号分隔都写在括号中即可
*可以理解为java中的接口,但不同的是,实现类编译器不强制实现Protocol中定义的所有接口
* 在方法签名上标识:@required,从字面上理解实现类必须实现该方法,其实写与不写一样的效果。也是默认的
* 在方法签名上标识:@optional,表示实现类对该方法的实现,是可选的。
<span style="color:#、属性的访问权限
* private : 只有类内部可以访问
* protected : 类内部和子类可以访问(默认)
* public : 访问没有限制
@interface Student : NSObject {
@private int _
@protected int _
@public float _
Student *stu = [[[Student alloc]init]autorelease];
stu-&_height = 20;
// 直接读写属性的值,开发当中一般不建议这么做。违背了面向对象的开发原则-》封装性
6、属性的定义与封装
// in Student.h
@interface Student : NSObject {
// 1. 定义属性,默认访问权限是@protected的,只有自已和子类可以直接访问
// 2.提供属性对外读写方法的声明,供外界调用。OC创建属性读写方法的命名规则是为,set方法: set+属性名,get方法:属性名
// 声明age的get和set方法
- (void)setAge:(int)
// 声明no的get和set方法
- (void)setNo:(int)
// in Student.m 实现头文件中的方法
#import &Student.h&
// 导入头文件
@implementation Student
// 实现头文件中的方法
- (int)age {
// age的getter方法
- (void)setAge:(int)age {
// age的setter方法
- (int)no {
- (void)setNo:(int)no {
<span style="color:#、使用@synthesize自动生成属性getter和setter方法的实现,同时会生成一个下划线(_)+属性名的成员变量。需要和@property配合使用。例:
@implementation Student
// 这一句顶下面的get和set方法,由
@synthesize
* 1. 如果显示实现了get方法,@synthesize会自动生成属性的set方法实现
* 2. 如果显示实现了set方法,@synthesize会自动生成属性的get方法实现
* 3. 如果即没有实现get方法,也没有实现set方法,则@synthesize会自动生成属性的get和set方法实现
- (int)age {
// age的getter方法
- (void)setAge:(int)age {
// age的setter方法
注:在xcode4.5以后的编译环境中,不需要写@synthesize声明生成属性的get和set方法实现。只需要在头文件中用@property定义即可自动在.m文件中生成相应属性的get和set方法实现
<span style="color:#、使用@property声明一个属性,编译器会自动生成该属性的getter和setter方法的声明
在xcode4.5以后版本的编译器环境中,会自动在.m文件中生成该属性getter和setter方法的标准实现,不需显示声明用@synthesize来生成属性的getter和setter方法实现。
<span style="color:#、@property属性参数
1& nonatomic : 多线程环境下,不需要线程保护(读写时不加锁),&
& atomic : (默认)多线程环境下需要线程保护(读写时加锁).
2& readonly : 表示在.m文件中只生成属性的getter方法的实现
& readwriter : 表示在.m文件中生成属性的getter和setter方法的实现(默认)
3& retain : 表示调用该属性的setter方法时,先release旧的值,再retain新的值。一般声明的成员变量是NSObject的子类才会添加该参数
& assign : 生成标准的getter和setter方法实现(默认),直接给属性赋值
4& getter= : 表示自定义属性生成的getter方法名称
& setter= : 表示自定义属性生成的setter方法名称
<span style="color:#、方法调用
* [实例对象 方法名:参数列表]
* [类名 方法名:参数列表]
Student *stu = [[[Student alloc]init]autorelease];
[stu setAge:22 andNo:10];
// 调用实例方法
[Student initWithAge:20];
// 调用静态方法
<span style="color:#、点(.)语法
Student *stu = [[[Student alloc]init]autorelease];
stu.age = 20;
// 相当于调用了对象的setAge方法(写)
int age = stu.
// 相当于调用了对象的getAge方法(读)
<span style="color:#、self关键字
相当于java中的this,不同的是self在不同的环境下,作用也不同。在实例方法中self可以当该对象使用,在静态方法中,self可以当类对象使用。
- (void)age {
& &return self.
// 这里self是实例对象本身
+ (id)newInstace {
//Student *stu = [[[Student alloc]init]autorelease];
Student *stu = [[[self alloc]init]autorelease];
<span style="color:#、@class : 在头文件中声明一个类的存在
为了提高效率,在只需要知道类的存在的情况下,不需要导入某个类的头文件。
// #import &Book.h&
// 不需要导入Book.h头文件,在.m文件真正使用的时候再导入
@interface Student : NSObject
@property Book *
<span style="color:#、@protocol : 在头文件中声明一个协议的存在
目的和@class一样
<span style="color:#、^ : 定义一个Block类型,与标准C语法中指向函数指针类型的写法非常相似
如:定义一个sum的Block类型,返回值为int,有两个int形参
int (^sum) (int, int) = ^(int a, int b) {
return a +
<span style="color:#、
#import : 用于导入一个类的头文件
#pragma mark : 写方法的注释
#pragma mark - : 方法注释分组
+ : 声明或定义一个静态方法
- : 声明或定义一个实例方法
<span style="color:#、方法定义
(一个冒号代表一个参数,冒号也是属性方法的一部份)
方法类型 (返回值类型)方法名称[参数列表] {
(一个冒号代表一个参数,冒号也是属性方法的一部份)
* 实例方法,方法名: sumAge:andNo:
- (int)setAge:(int)age andNo:(int)no {
// 在这里插入代码逻辑
* 静态方法
+ (id)initWithAge:(int)age {
// 在这里插入代码逻辑
* 实例方法通过类的实例对象访问
* 静态方法通过类名或self访问
<span style="color:#、内存管理
&1& 凡是从NSObject中继承的类都需要自己管理内存,在OC语法中,创建的任何一个对象都拥有一个引用计数器,第一次创建的时候这个引用计数器为1,当引用计数器的值为0时,该对象会被销毁。内存管理涉及到以下接口:
* release : 对象的引用计数器减1
* retain : 对象的引用计数器加1
* retainCount : 获取对象当前引用计数器的数量
对象生命周期回调接口:
* init : 对象的默认构造方法,如果自定义构造方法用于初始化成员变量时,必须先调用父类的构造方法,并判断获得的对象是否为nil,再初始化成员变量。
如:- (void)initWithAge:(int)age {
* dealloc : 对象销毁时,系统会自动调用该方法,通常在该方法中释放内存或其它资源。在重写dealloc方法时,注意在代码最后面调用父类的dealloc方法,用于释放内存等相关资源。
- (void)dealloc {
&2& 不需要管理内存的对象
* 基本数据类型
* 系统自带的类调用自己的静态方法创建的对象,是自动释放内存的,不需要管理
&3& 内存管理原则
只有向对象发送了alloc,retain,copy,new消息才有必要做release操作
* 谁alloc,retain,copy,new谁release
* 谁创建谁释放(release)
* 谁没有allock,retain,copy,new,你就不要做release操作
&4& 自动内存管理(由autoreleasepool管理)
在创建对象的同时,调用autorelease方法,会将该对象的一个引用自动存放到最近创建的一个自动释放释放池中。以后该对象就不需要手动来release操作,徐非做了retain,copy等修改了引用计数器的操作。当自动释放池被销毁时,会向池子中所有对象发送一个release消息,池子中的所有对象的引用计数器此时会减1,只有当池子中的引用计数器为0时,该对象才会被彻底销毁。不是说只要将对象交给自动释放池了,池子被销毁,池子中的所有对象就一定会被销毁。
Student *stu = [[[Student alloc] init]autorelease];
// 此时stu对象将放到这个大括号中的自动释放池子中
[stu retain];
// 如果加了这一句,此时stu的引用计数器为2,这时候如果在池子销毁前没有向对象发送release消息,就算池子销毁,该对象也还是会造成内存泄露
// 程序执行到此处,代表自动释放池被销毁,意味着池子中的所有对象都会接到一个release消息
<span style="color:#、OC中的类似Java的toString方法
Student *stu = [[[Student alloc]init]autorelease];
NSLog(@&%@&,stu);
// 默认打印的是stu对象的内存地址
* 重写父类的description方法,可自定义打印对象的信息
- (NSString *)description {
& &NSLog(@&age is %i&,_age);
已发表评论数()
&&登&&&录&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见

我要回帖

更多关于 alt属性怎么写 的文章

 

随机推荐