美文网首页
【Solidity学习笔记】函数、变量的可见性

【Solidity学习笔记】函数、变量的可见性

作者: 海阳之新 | 来源:发表于2018-03-30 18:15 被阅读42次

    3.9.1可见性

    函数或者状态变量的可见性定义了谁可以看到它。
    函数和状态变量有四种可见性:external、public、internal、private
    函数可见性默认为public,状态变量可见性默认为internal。各可见性函数的含义如下:
    external:外部函数只能由其他合约调用,或者通过交易调用。外部函数f不能被内部函数调用,
    也就是说,f()没有用,但是this.f()有用。不能把external可见性应用到状态变量。
    public:公共函数和状态变量可以用所有可行办法访问。编译器生成的存取器(accessor)函数
    都是公共状态变量。用户不能创建自己的存取器。事实上,它只生成getters,而不生成setters。
    internal:内部函数和状态变量只可以内部访问,也就是说,从当前合约内和继承它的合约访问。
    不可以使用this访问它。状态变量默认为internal,可以在当前合约内和继承它的合约访问。
    private:私有函数和状态变量类似于内部函数,但是继承合约不可以访问它们。
    下面给出了可见性和存取器(accessor)的一个示例:

    pragma solidity ^0.4.21;
    
    contract sample1
    {
        int public b = 78; //int256型,public
        int internal c = 90;
        function sample1()
        {
            this.a(); //外部访问
            a(); //编译会出错
            b = 21; //内部访问,internal,类似php中的protect
            this.b; //外部访问
            this.b(); //外部访问
            this.b(8); //编译会出错
            this.c(); //编译会出错
            c = 9; //内部访问,internal,类似php中的protect
        }
    
        function a() external //外部修饰符
        {
    
        }
    }
    
    
    contract sample2
    {
        int internal d = 9; //内部访问,internal,类似php中的protect
        int private e = 90; //与php中的一致,仅限在类内部使用,不能被继承
    }
    
    contract sample3 is sample2 //is为继承关键词,相当于php中的extend
    {
        sample1 s;
        function sample3()
        {
            s = new sample1();
            s.a(); //外部访问
            var f = s.b; //外部访问
            s.b = 18; //编译会出错,b是内部变量,不能访问到
            s.c(); //编译会出错
            d = 8; //内部访问
            e = 7; //编译会出错
        }
    }
    

    风格建议

    Yes

    function kill() public onlyowner { #函数的可见性修饰符应该在任何自定义修饰符之前出现。
        selfdestruct(owner);
    }
    

    No

    function kill() onlyowner public {
        selfdestruct(owner);
    }
    

    相关文章

      网友评论

          本文标题:【Solidity学习笔记】函数、变量的可见性

          本文链接:https://www.haomeiwen.com/subject/hvnicftx.html