zephir-类和对象2

前言

先在这里感谢各位zephir开源技术提供者

zephir全面使用对象编程,这就是为什么拓展的使用方式只能是方法和类,你也将看到,大部分的时间,运行时错误引发异常,而不是致命错误或警告。今天讲一步步讲解zephir类方法变量范围等等的使用,希望大家喜欢.

注:笔者水平有限,说的不正确的地方希望大家多多指正,一同交流技术

附上:

喵了个咪的博客:w-blog.cn

zephir官网地址:http://zephir-lang.com/

github地址:https://github.com/phalcon/zephir

严格/灵活的参数的数据类型

在ZEPHIR,你可以指定一个方法的每个参数的数据类型。缺省情况下,这些数据类型是灵活的,这意味着,如果使用错误的(但兼容)的数据类型的值被传递,ZEPHIR将尝试转换为预期的​​类型:

public function filterText(string text, boolean escape=false)
{//...
}

被调用:

<?php$o->filterText(1111, 1); // OK
$o->filterText("some text", null); // OK
$o->filterText(null, true); // OK
$o->filterText("some text", true); // OK
$o->filterText(array(1, 2, 3), true); // 失败

然而,传递一个错误的类型可能会经常导致错误,不使用特定的API会产生意想不到的效果。您可以通过设置一个严格的数据类型的参数禁止自动转换:

public function filterText(string! text, boolean escape=false)
{//...
}

现在,大多数错误类型的调用会导致一个异常由于无效数据类型传递:

<?php$o->filterText(1111, 1); // 失败
$o->filterText("some text", null); // OK
$o->filterText(null, true); // 失败
$o->filterText("some text", true); // OK
$o->filterText(array(1, 2, 3), true); // 失败

通过指定什么参数严格,什么是灵活的,开发人员可以做到真正想要的定制行为。

只读参数

使用关键字“const”可以参数标记为只读的,内部参数标注该属性不能修改方法:

namespace App;class MyClass
{// "a" 是一个常量public function getSomeData(const string a){// 这将抛出一个编译器异常let a = "hello";}
}

当一个参数被声明为只读的时候,编译器可以使安全假设和对这些变量进行进一步的优化。

类的属性

类成员变量被称为“属性”。默认情况下,他们作为PHP的属性。属性实现通常使用可见性修饰符,在Zephir中可见性修饰符是强制性的:

namespace Test;class MyClass
{public myProperty1;protected myProperty2;private myProperty3;}

在类方法访问非静态属性可以通过使用->(对象操作符):这个->属性:

namespace Test;class MyClass
{protected myProperty;public function setMyProperty(var myProperty){let this->myProperty = myProperty;}public function getMyProperty(){return this->myProperty;}
}

属性可以有默认值。这些值必须能够被定义,编译时,不得依赖于运行时的其他值:

namespace Test;class MyClass
{protected myProperty1 = null;protected myProperty2 = false;protected myProperty3 = 2.0;protected myProperty4 = 5;protected myProperty5 = "my value";
}

更新属性

开发人员可以通过“->属性”更新属性值:

let this->myProperty = 100;

zephir会检查该属性是否存在,如果一个属性没有声明,你会得到一个编译警告:

CompilerException: Property '_optionsx' is not defined on class 'App\MyClass' in /Users/scott/utils/app/myclass.zep on line 62this->_optionsx = options;------------^

如果你想避免这个编译器验证或动态创建一个属性,您可以使用字符串的属性名通过”{}”将属性名包裹起来:

let this->{"myProperty"} = 100;

您还可以使用一个简单的变量更新属性,属性名称将从变量获取:

let someProperty = "myProperty";
let this->{someProperty} = 100;

读属性

属性可以通过“->”运算符获取:

echo this->myProperty;

当更新属性可以动态地读:

//避免编译器检查或动态的定义的属性
echo this->{"myProperty"};//读取和使用一个变量名
let someProperty = "myProperty";
echo this->{someProperty}

类的常量

类是保持不变的,一旦扩展被编译的类常量就已经确认下来了。

namespace Test;class MyClass
{const MYCONSTANT1 = false;const MYCONSTANT2 = 1.0;
}

类常量可以使用类名称和访问静态操作符(::):

namespace Test;class MyClass
{const MYCONSTANT1 = false;const MYCONSTANT2 = 1.0;public function someMethod(){return MyClass::MYCONSTANT1;}
}

调用方法

方法可以被使用在PHP对象操作符(- >)调用:

namespace Test;class MyClass
{protected function _someHiddenMethod(a, b){return a - b;}public function someMethod(c, d){return this->_someHiddenMethod(c, d);}
}

静态方法必须调用使用静态操作符(::):

namespace Test;class MyClass
{protected static function _someHiddenMethod(a, b){return a - b;}public static function someMethod(c, d){return self::_someHiddenMethod(c, d);}
}

你可以以动态的方式调用方法如下:

namespace Test;class MyClass
{protected adapter;public function setAdapter(var adapter){let this->adapter = adapter;}public function someMethod(var methodName){return this->adapter->{methodName}();}
}

参数的命名

ZEPHIR支持名称或关键字参数调用方法的参数。如果你想通过以任意顺序参数,记录参数的含义或以更优雅的方式指定参数命名参数可以是有用的。

考虑下面的例子,一个名为“Image”类有接收四个参数的方法:

namespace Test;class Image
{public function chop(width = 600, height = 400, x = 0, y = 0){//...}
}

使用标准方法的调用方法:

i->chop(100); // width=100, height=400, x=0, y=0
i->chop(100, 50, 10, 20); // width=100, height=50, x=10, y=20

使用命名参数,您可以:

i->chop(width: 100); // width=100, height=400, x=0, y=0
i->chop(height: 200); // width=600, height=200, x=0, y=0
i->chop(height: 200, width: 100); // width=100, height=200, x=0, y=0
i->chop(x: 20, y: 30); // width=600, height=400, x=20, y=30

当编译器在编译时不知道这些参数的正确顺序 他们必须解决在运行时,在这种情况下,可能会有一个最小附加额外的开销:

let i = new {someClass}();
i->chop(y:30, x: 20);

总结

那么到这里关于zephir类方法相关的知识就已经结束了,那么从下节开始将讲解内置的一些方法函数的使用,已经流程控制语句,希望大家喜欢!

应为确实zephir的类方法这一块的类容比较多,笔者在这里分成两个小节进行说明,多谢大家的支持!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

zephir技术交流:246348908 欢迎大家的加入!

感谢zephir开发人员:

zephir-类和对象2相关推荐

  1. C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)

    1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...

  2. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  3. C02-程序设计基础提高班(C++)第9周上机任务-类和对象

    第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下 ...

  4. 函数返回类的对象与拷贝构造函数

    C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下. ...

  5. ZJU-java进阶笔记 第一、二周(类与对象,对象交互)

    对象变量是对象的管理者,而非所有者 VendingMachine vm = new VendingMachine(); this指代当前对象 成员函数可以直接(不需要点运算符)调用本类的其他成员函数 ...

  6. 3个题目熟悉类和对象基础

    1.按要求编写Java应用程序: (1)编写西游记人物类(XiYouJiRenWu)其中属性有:身高(height),名字(name),武器(weapon)方法有:显示名字(printName),显示 ...

  7. 刻意练习:Python基础 -- Task10. 类与对象

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  8. java中具有继承关系的类及其对象初始化顺序

    先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...

  9. python的类和对象_Python类与对象实验

    一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...

  10. 简单介绍实体类或对象序列化时,忽略为空属性的操作

    这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 第一种,在配置文件配置 在application.xml直接 ...

最新文章

  1. python3中的int类型占64位_在windows 10 64位计算机中,默认情况下,numpy数组数据类型将以int32形式出现...
  2. WINCE cvrtbin命令简介
  3. echo 12345678 | base64 产生的结果跟12345678真正的base64编码不对
  4. poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)
  5. 排序小记【1】基本排序算法
  6. 算法第四版开发环境的配置
  7. dubbo服务者源码分期
  8. 汇编语言教程 -- 开始
  9. 2018小米商城首页html,html+css实现小米商城首页静态页面
  10. ESP8266-Arduino编程实例-ADS1115模数转换器驱动
  11. 弘辽科技:新手拼多多店铺该怎么引流
  12. MacBook下载的软件显示无法打开“某某某”,因为Apple无法检查其是否包含恶意软件。”的解决办法
  13. 【MDCC 2015】平台与技术-Android专场(上):剖析Android应用架构与设备体验
  14. 【计算机组成原理】中央处理器总结——基本知识要点汇总
  15. 关于LPC21**系列串口初始化已知晶振频率 求U0DLL和U0DLM 重点注意M P 和分频倍率n
  16. pvqc计算机类专业英语,计算机 英文
  17. UR_RTDE 在Linux安装与使用过程中遇到 一些坑
  18. CentOS7 服务器分析挖矿病毒,清理挖矿病毒 tor2web
  19. kerberos kubernetes读音
  20. java对接银联商务公众号+服务窗支付(4)

热门文章

  1. Rosalind Java| Counting DNA Nucleotides
  2. PHP的安装以及项目的运行
  3. 2022年全国资质认证补贴政策汇总详情!
  4. Doxygen 配置
  5. 《Learning Unsupervised Metaformer for Anomaly Detection》论文阅读笔记
  6. 【心田花开】三年级语文上册南宋古诗鉴赏
  7. 100题前端面试[题目+答案] -- 自用
  8. 黑板模式(Blackboard Design Pattern)。
  9. 2020第二届金融科技大会在沪成功召开, “大数据百强榜”重磅出炉!
  10. PayPal/Stripe/Square轮询收单系统 stripe paymentlink支付模式