前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephir-(8)类和对象1

zephir-(8)类和对象1

作者头像
喵了个咪233
发布2018-03-01 17:45:13
5860
发布2018-03-01 17:45:13
举报

#zephir-类和对象1#

##前言## 先在这里感谢各位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开发人员:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档