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

【Solidity学习笔记】函数、变量的可见性_第1张图片

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学习笔记】函数、变量的可见性)