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);
}
网友评论