如果您对php使用变量动态创建类的对象用法示例和php使用变量动态创建类的对象用法示例是什么感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解php使用变量动态创建类的对象用法示例的各种细节,并对
如果您对php使用变量动态创建类的对象用法示例和php使用变量动态创建类的对象用法示例是什么感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解php使用变量动态创建类的对象用法示例的各种细节,并对php使用变量动态创建类的对象用法示例是什么进行深入的分析,此外还有关于c – 为什么动态创建的对象与对象的大小相差两倍?、C#动态创建单例类的对象、iOS 动态特性初研究(利用 JSON 动态创建类型和对象)、iOS动态特性初研究(利用JSON动态创建类型和对象)的实用技巧。
本文目录一览:- php使用变量动态创建类的对象用法示例(php使用变量动态创建类的对象用法示例是什么)
- c – 为什么动态创建的对象与对象的大小相差两倍?
- C#动态创建单例类的对象
- iOS 动态特性初研究(利用 JSON 动态创建类型和对象)
- iOS动态特性初研究(利用JSON动态创建类型和对象)
php使用变量动态创建类的对象用法示例(php使用变量动态创建类的对象用法示例是什么)
本文实例讲述了PHP使用变量动态创建类的对象。分享给大家供大家参考,具体如下:
这是一个能用变量动态创建类的对象的用法,就是根据$pay_code变量值来创建对象.
例如下例就是创建类T的一个对象$payment.然后就可以使用了.咋一看像是个新的知识点,其实不然,只不过是编程中的一个技巧而已.
更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《》
希望本文所述对大家PHP程序设计有所帮助。
c – 为什么动态创建的对象与对象的大小相差两倍?
#include <iostream> using namespace std; struct X { int i; X* x; }; void birth(X* head,int quant){ X* x = head; for(int i=0;i<quant-1;i++){ x->i = i+1; x->x = new X; x = x->x; } x->i = quant; x->x = 0; } void kill(X* x){ X* next; while(1==1){ cout << x->i << endl; cout << (long)x << endl; next = x->x; delete x; if(next == 0){ break; } else { x = next; } } } int main(){ cout << (long)sizeof(X) << endl; X* x = new X; birth(x,10); kill(x); return 0; }
这似乎是有效的,除了当你查看每个对象的地址时……
16 1 38768656 2 38768688 3 38768720 4 38768752 5 38768784 6 38768816 7 38768848 8 38768880 9 38768912 10 38768944
尽管X的大小仅为16位,但它们似乎相隔32位.我是如何创建对象的,或者这只是动态分配如何工作的结果?
解决方法
The order and contiguity of storage allocated by successive calls to
thealigned_alloc
,calloc
,malloc
,andrealloc
functions is
unspecified. The pointer returned if the allocation succeeds is
suitably aligned so that it may be assigned to a pointer to any type
of object with a fundamental alignment requirement and then used to
access such an object or an array of such objects in the space
allocated
由于内存必须“适当对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针”,因此malloc等人返回的内存倾向于从不同的,与平台相关的倍数开始 – 通常为8-或16字节边界.
并且因为new通常用malloc实现,所以这也适用于C new.
C#动态创建单例类的对象
单例类
public class SnappingClass : ISnappingEnvironment, IExtension
{
//
private static readonly SnappingClass instance = null;
static SnappingClass()
{
instance = new SnappingClass();
}
private SnappingClass()
{
}
public static SnappingClass Instance
{
get
{
return instance;
}
}
动态创建:
void IExtensionManagerAdmin.StartupExtensions(string componentCategory, string jitCategory, ref object initializationData)
{
var typeInfos = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IExtension)))).ToArray();
foreach (var typeInfo in typeInfos)
{
//Console.WriteLine(typeInfo.FullName);
//IExtension pExtension = typeInfo.Assembly.CreateInstance(v.FullName) as IExtension;
//MethodInfo methodInfo = typeInfo.GetMethod("Instance", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { }, null);
//IExtension pExtension = methodInfo.Invoke(null, null) as IExtension;
//
PropertyInfo propertyInfo = typeInfo.GetProperty("Instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
//
//PropertyInfo[] propertyInfos = typeInfo.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
//foreach (PropertyInfo propertyInfo in propertyInfos)
//{
// Console.WriteLine(propertyInfo.Name);
//}
IExtension pExtension = propertyInfo.GetValue(null, null) as IExtension;
//
pExtension.Startup(ref initializationData);
this.pExtensionList.Add(new KeyValuePair<string, IExtension>(pExtension.Name, pExtension));
}
}
-----------------------------------------------------------------------------------------
iOS 动态特性初研究(利用 JSON 动态创建类型和对象)
1. 什么是动态特性?
程序可以访问,检测和修改它本身状态或行为的能力。用我自己的理解,这里的状态和行为,理解成变量,属性和方法,会更加形象一点。
2. 与动态特性相关的概念,selector,IMP,Class
Class: 从语法形式上看,和 UIButton,NSString 一样,是一种类型。
Class 被定义为一个指向 objc_class 的结构体指针。
它是指向对象的类结构体的指针,该类结构体含有一个指向其父类类结构的指针,访类方法的链表,该类方法的缓存以及其他必要信息。见下图
除了静态方法来创建对象,还可以使用 string 来创建,NSClassFromString。
SEL:定义成一个指向 objc_selector 指针
运行时,会在方法链表中根据 SEL 查找具体的实现方法 IMP。为什么不用函数指针直接调用,而加了一层 SEL?我的理解,首先 Object-C 的类不能直接应用函数指针,这样只能做一个 @selector 语法来取(本人在 OC 中写过状态机,用函数指针形式写 action,但一直报错,只能用 selector 代替);其次,SEL 还可以配合动态方法来使用,例如 NSSelectorFromString,performSelector, 动态添加方法,并执行。
IMP:就是定义一个函数指针的形式
它包含一个接受消息的对象(self 指针),调用方法 SEL,以及若干参数,并返回一个 id。
3. 举例子,如何将 JSON 直接映射成对象,如何将对象直接映射成 DB(coreData 原理)
3.1 定义该类的属性,方法,生成对象。
用动态方法,获得该对象的属性 / 变量列表 (class_copyPropertyList/class_copyIvarList),遍历获得每个属性的名称 (property_getName),然后将 JSON 转换 Dic,用 key-value (setvalueForkey,valueForKey) 方法,对对象进行赋值,取值操作。
此种方法,抽象出了公用的 setter 方法(用 dictionary 給对象赋值),但是缺点是,类型要事先定义。无法动态生成类型。这种例子,网上很多,而且不明白为什么例子中都把 property name 和 attribute 值打印出来,至于怎么用,半个字都没提?
(上面是最长见的使用方式,有人问我能否不事先定义类型,然后利用 JSON 来创建类型呢?这个还把我问住了)后来查阅 OC runtime guide, 发现有动态添加变量的方法(class_addIvar), 于是思路由此打开:
3.2 首先定义一个空的类
(没有属性,变量,方法),只有一个类名,然后运行时,給该类添加变量(当时没有查到可以动态添加属性的方法,后来发现有,但是要到 iOS4.3 以后才行),随后用給变量赋值。但是结果让人失望,无法动态添加变量。原因是 class_addIvar 只能在动态创建类型的时候,添加变量,也就是 “class_addIvar"This function may only be called after objc_allocateClassPair and beforeobjc_registerClassPair.Adding an instance variable to an existing class is notsupported”,而事先定义类是静态创建的类,故无法在 runtime 时添加变量 (http://stackoverflow.com/questions/17888877/objective-c-add-property-in-runtime)
于是,只能放弃事先定义类的方式,转而利用在动态创建类时 (objc_allocateClassPair),添加变量 。然后用給变量赋值和取值的方式 (object_setInstanceVariable,object_getIvar, 注意,无法用 key-value 的方式操作,这种方法只有静态定义属性后才行),但这种方式,就只能用纯 C 的方式封装,赋值,取值都要传进 obj 参数,比较繁琐,没有面向对象那么方便。
结论:3.2 中的结论,如果编译前定义类,那么无法用 runtime 添加变量,这种方法行不通;只有在 runtime 时,在 objc_allocateClassPair 和 objc_registerClassPair 之间用 class_addIvar 添加变量
3.3 后来查到有动态添加 property 的方法
(class_addProperty),在 4.3 之后。于是想到一种动态创建类型,并且可以用 OC 语法的方式访问变量。
首先,动态创建类型,添加变量 (这个很重要,因为当我们访问 property 时,实际上是要对变量操作,如果没有添加变量,那么就是 null),注册类型,然后往里动态添加属性,随后就可以象 OC 一样方便访问属性了 (因为静态类中属性会默认有一个和它同名的变量,对属性操作,实际上是对该变量操作)。
但实际上对该属性赋值后,取值却是 null。因为只有在编译前定义的属性才会默认一个变量,property 实际上只是提供了 setter 和 getter 的方法,至于你要把值存贮在哪里,需要自己设定,所以还需要在 class_addProperty 方法后,添加 property 的 setter,getter,并在其中确定需要把值保存到哪里,从哪里取值。
getter
setter
这样我们就能用 ClassA objA; [objAsetxxx:xxx]; [objA xxx] 的方法来访问属性了(本人写了一个简单的实现,但暂时无法上传 github,稍后会上传,请各位上传)
3.4 使用动态创建类,对象,以及 ORM 的优点,缺点
这个例子有如下几个特点:1. 可以动态生成类型 2. 可以用 OC 的方式访问属性。纯粹的 “动态”。
当然也有美中不足的地方,首先动态创建对象的类型都是 id 类型(因为是动态创建,事先没有定义具体类型),视觉上不直观。其次编译过程中,会报 warning,因为 property 是动态添加的,不是编译之前确定的,所以编译器不知道 setter,getter 方法哪里来的。(当然可以用 performSelector 来调用就没有 warning 问题,但是调用方式太繁琐)
但是不影响使用。
结果
结论:3.3 的方法比 3.2,3.1 的方法牛逼,直接动态创建类型和对象,但是牺牲的是 code 的可读性和可维护性,研究的意义大于实用意义。
注意:这里需要大家研究的是,如何通过 JSON 的值,确定动态添加的变量和 property 的类型,我的思路是,可以容易区分 NSString 和 NSNumber,但是如果确定 int,long,float, long long 等类型?应该可以通过值的大小范围来确定,例如 int -256~255
3.5 如何将对象映射进 DB 中,其实原理是一样的,可以运行时,获得类名,属性名,属性类型,值,然后用 sqlite3 的接口创建表,列,值,类型等等。其实 Coredata 也是运用了这个动态的原理来实现的。
iOS动态特性初研究(利用JSON动态创建类型和对象)
1.什么是动态特性?
程序可以访问,检测和修改它本身状态或行为的能力。用我自己的理解,这里的状态和行为,理解成变量,属性和方法,会更加形象一点。
2.与动态特性相关的概念,selector,IMP,Class
Class: 从语法形式上看,和UIButton,NSString一样,是一种类型。
Class被定义为一个指向objc_class的结构体指针。
它是指向对象的类结构体的指针,该类结构体含有一个指向其父类类结构的指针,访类方法的链表,该类方法的缓存以及其他必要信息。见下图
除了静态方法来创建对象,还可以使用string来创建,NSClassFromString。
SEL:定义成一个指向objc_selector指针
运行时,会在方法链表中根据SEL查找具体的实现方法IMP。为什么不用函数指针直接调用,而加了一层SEL?我的理解,首先Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取(本人在OC中写过状态机,用函数指针形式写action,但一直报错,只能用selector代替);其次,SEL还可以配合动态方法来使用,例如NSSelectorFromString,performSelector,动态添加方法,并执行。
IMP:就是定义一个函数指针的形式
它包含一个接受消息的对象(self指针),调用方法SEL,以及若干参数,并返回一个id。
3. 举例子,如何将JSON直接映射成对象,如何将对象直接映射成DB(coreData原理)
3.1定义该类的属性,方法,生成对象。
用动态方法,获得该对象的属性/变量列表(class_copyPropertyList/class_copyIvarList),遍历获得每个属性的名称(property_getName),然后将JSON转换Dic,用key-value(setvalueForkey,valueForKey)方法,对对象进行赋值,取值操作。
此种方法,抽象出了公用的setter方法(用dictionary給对象赋值),但是缺点是,类型要事先定义。无法动态生成类型。这种例子,网上很多,而且不明白为什么例子中都把property name和attribute值打印出来,至于怎么用,半个字都没提?
(上面是最长见的使用方式,有人问我能否不事先定义类型,然后利用JSON来创建类型呢?这个还把我问住了)后来查阅OC runtime guide,发现有动态添加变量的方法(class_addIvar),于是思路由此打开:
3.2首先定义一个空的类
(没有属性,变量,方法),只有一个类名,然后运行时,給该类添加变量(当时没有查到可以动态添加属性的方法,后来发现有,但是要到iOS4.3以后才行),随后用給变量赋值。但是结果让人失望,无法动态添加变量。原因是class_addIvar只能在动态创建类型的时候,添加变量,也就是“class_addIvar"This function may only be called after objc_allocateClassPair and beforeobjc_registerClassPair.Adding an instance variable to an existing class is notsupported”,而事先定义类是静态创建的类,故无法在runtime时添加变量(http://stackoverflow.com/questions/17888877/objective-c-add-property-in-runtime)
于是,只能放弃事先定义类的方式,转而利用在动态创建类时(objc_allocateClassPair),添加变量 。然后用給变量赋值和取值的方式(object_setInstanceVariable,object_getIvar,注意,无法用key-value的方式操作,这种方法只有静态定义属性后才行),但这种方式,就只能用纯C的方式封装,赋值,取值都要传进obj参数,比较繁琐,没有面向对象那么方便。
结论:3.2中的结论,如果编译前定义类,那么无法用runtime添加变量,这种方法行不通;只有在runtime时,在objc_allocateClassPair和objc_registerClassPair之间用class_addIvar添加变量
3.3后来查到有动态添加property的方法
(class_addProperty),在4.3之后。于是想到一种动态创建类型,并且可以用OC语法的方式访问变量。
首先,动态创建类型,添加变量(这个很重要,因为当我们访问property时,实际上是要对变量操作,如果没有添加变量,那么就是null),注册类型,然后往里动态添加属性,随后就可以象OC一样方便访问属性了 (因为静态类中属性会默认有一个和它同名的变量,对属性操作,实际上是对该变量操作)。
但实际上对该属性赋值后,取值却是null。因为只有在编译前定义的属性才会默认一个变量,property实际上只是提供了setter和getter的方法,至于你要把值存贮在哪里,需要自己设定,所以还需要在class_addProperty方法后,添加property的setter,getter,并在其中确定需要把值保存到哪里,从哪里取值。
getter
setter
这样我们就能用ClassA objA; [objAsetxxx:xxx]; [objA xxx]的方法来访问属性了(本人写了一个简单的实现,但暂时无法上传github,稍后会上传,请各位上传)
3.4使用动态创建类,对象,以及ORM的优点,缺点
这个例子有如下几个特点:1.可以动态生成类型 2.可以用OC的方式访问属性。纯粹的“动态”。
当然也有美中不足的地方,首先动态创建对象的类型都是id类型(因为是动态创建,事先没有定义具体类型),视觉上不直观。其次编译过程中,会报warning,因为property是动态添加的,不是编译之前确定的,所以编译器不知道setter,getter方法哪里来的。(当然可以用performSelector来调用就没有warning问题,但是调用方式太繁琐)
但是不影响使用。
结果
结论:3.3的方法比3.2,3.1的方法牛逼,直接动态创建类型和对象,但是牺牲的是code的可读性和可维护性,研究的意义大于实用意义。
注意:这里需要大家研究的是,如何通过JSON的值,确定动态添加的变量和property的类型,我的思路是,可以容易区分NSString和NSNumber,但是如果确定int,long,float, long long等类型?应该可以通过值的大小范围来确定,例如int -256~255
3.5如何将对象映射进DB中,其实原理是一样的,可以运行时,获得类名,属性名,属性类型,值,然后用sqlite3的接口创建表,列,值,类型等等。其实Coredata也是运用了这个动态的原理来实现的。
今天的关于php使用变量动态创建类的对象用法示例和php使用变量动态创建类的对象用法示例是什么的分享已经结束,谢谢您的关注,如果想了解更多关于c – 为什么动态创建的对象与对象的大小相差两倍?、C#动态创建单例类的对象、iOS 动态特性初研究(利用 JSON 动态创建类型和对象)、iOS动态特性初研究(利用JSON动态创建类型和对象)的相关知识,请在本站进行查询。
本文标签: