#zephir-类和对象1#
![](https://i0.wp.com/i.imgur.com/OuZmZ0R.png)
##前言## 先在这里感谢各位zephir开源技术提供者
zephir全面使用对象编程,这就是为什么拓展的使用方式只能是方法和类,你也将看到,大部分的时间,运行时错误引发异常,而不是致命错误或警告。今天讲一步步讲解zephir类方法变量范围等等的使用,希望大家喜欢.
注:笔者水平有限,说的不正确的地方希望大家多多指正,一同交流技术
附上:
喵了个咪的博客:w-blog.cn
zephir官网地址:http://zephir-lang.com/
github地址:https://github.com/phalcon/zephir
##Class##
每个Zephir文件必须实现一个类或一个接口(只能一个)。类的结构非常类似于PHP的一个类:
namespace Test;
/**
* 这是一个示例类
*/
class MyClass
{
}
##类的修饰符##
支持下面的类修饰符:
Final:这个类不能被extended:
namespace Test;
/**
* 他的类不能被另一个类extended
*/
final class MyClass
{
}
Abstract:这个类不能被实例化:
namespace Test;
/**
* 这个类不能被实例化
*/
abstract class MyClass
{
}
##类的方法##
“function”关键字引入了一个方法。一般的方法都实现了可见性的定义,每个方法都必须设置可见性这是zephir强制的:
namespace Test;
class MyClass
{
public function myPublicMethod()
{
// ...
}
protected function myProtectedMethod()
{
// ...
}
private function myPrivateMethod()
{
// ...
}
}
方法可以接收必需和可选参数:
namespace Test;
class MyClass
{
/**
* 所有参数是必需的
*/
public function doSum1(a, b)
{
return a + b;
}
/**
* 只有“a”是必需的,“b”是可选的,它有一个默认值
*/
public function doSum2(a, b = 3)
{
return a + b;
}
/**
* 这两个参数是可选的
*/
public function doSum3(a = 1, b = 2)
{
return a + b;
}
/**
* 参数需要和它们的值必须是整数
*/
public function doSum4(int a, int b)
{
return a + b;
}
/**
* 静态类型的默认值
*/
public function doSum4(int a = 4, int b = 2)
{
return a + b;
}
}
##可选参数可以为空##
这个编译器保证当一个变量是null值时,Zephir会把null转换成最接近的值:
public function foo(int a = null)
{
echo a; // “打印0
}
public function foo(boolean a = null)
{
echo a; // 打印false
}
public function foo(string a = null)
{
echo a; // 打印空字符串
}
public function foo(array a = null)
{
var_dump(a); // 打印空数组
}
##可见性##
- Public:方法标记为“Public”,这意味着公共方法都能使用它。
- Protected:方法标记为“Protected”,这意味着只能调用在类中或类继承中被调用。
- Private:方法标记为“Private”,这意味着私有方法仅对当前类使用。
##可修改性##
- Final:如果一个方法使用了这个修饰符将不能被重载
- Deprecated:方法标记为“Deprecated”抛出E_DEPRECATED错误时调用。
##Getter/Setter 快捷操作##
在c#中,您可以使用get / set / toString Zephir-shortcuts,该特性允许轻松地编写setter和getter属性而不用明显的去实现这些方法。
例如,没有捷径,我们能找到的代码:
namespace Test;
class MyClass
{
protected myProperty;
protected someProperty = 10;
public function setMyProperty(myProperty)
{
this->myProperty = myProperty;
}
public function getMyProperty()
{
return this->myProperty;
}
public function setSomeProperty(someProperty)
{
this->someProperty = someProperty;
}
public function getSomeProperty()
{
return this->someProperty;
}
public function __toString()
{
return this->myProperty;
}
}
您可以使用shortcuts写相同的代码如下:
namespace App;
class MyClass
{
protected myProperty {
set, get, toString
};
protected someProperty = 10 {
set, get
};
}
当代码编译这些方法导出为真正的方法,但你不需要把它们写一个接一个。
##返回类型提示##
类和接口中的方法可以返回类型提示,这些将为编译器提供有用的额外信息 通知您关于您的应用程序中的错误。 参考下面的例子:
namespace App;
class MyClass { public function getSomeData() -> string { // 这将抛出一个编译器异常 // 返回值以来(boolean)不匹配 // 预期的返回类型为string return false; }
public function getSomeOther() -> <App\MyInterface>
{
// 这将抛出一个编译器异常
// 如果没有实现返回的对象
// 预期的结果是App\MyInterface
return new App\MyObject;
}
public function process()
{
var myObject;
//类型,提示会告诉编译器
// myObject是一个类的实例
// 实现应用 App\MyInterface
let myObject = this->getSomeOther();
// 如果使用App\MyInterface编译器将检查
// 实现了一个名为“someMethod”的方法
echo myObject->someMethod();
}
}
##返回类型:Void##
方法也可以标记为“Void”。 这意味着一个方法不允许返回任何数据:
public function setConnection(connection) -> void
{
let this->_connection = connection;
}
这是为什么有用吗?因为如果程序期望从这些方法的返回值,编译器可以检测和产生一个编译器异常:
let myDb = db->setConnection(connection);
myDb->execute("SELECT * FROM robots"); // 这将产生一个异常
##总结##
应为确实zephir的类方法这一块的类容比较多,笔者在这里分成两个小节进行说明,多谢大家的支持!
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
zephir技术交流:246348908 欢迎大家的加入!
感谢zephir开发人员:
![](https://i0.wp.com/i.imgur.com/puoG4mx.png)
来源:oschina
链接:https://my.oschina.net/u/2394822/blog/632787