Solidity 合约中的函数和状态变量具有不同的可见性。这些可见性关键字用于限制合约内外对函数和状态变量的访问权限。
以下是 Solidity 中可见性关键字的详细说明:
public
:可以在合约内外被调用和读取。external
:只能在合约外部被调用。该关键字通常用于公开函数,以便其他合约可以调用它。internal
:只能在当前合约和其继承合约中被调用和读取。private
:只能在当前合约中被调用和读取。
以下示例演示了如何在 Solidity 合约中使用不同的可见性关键字。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract Visibility {
uint256 private privateVar;
uint256 internal internalVar;
uint256 public publicVar;
function setVars(uint256 _privateVar, uint256 _internalVar, uint256 _publicVar) public {
privateVar = _privateVar;
internalVar = _internalVar;
publicVar = _publicVar;
}
function getPrivate() private view returns (uint256) {
return privateVar;
}
function getInternal() internal view returns (uint256) {
return internalVar;
}
function getPublic() public view returns (uint256) {
return publicVar;
}
function getExternal() external view returns (uint256) {
return publicVar;
}
}
Visibility
合约定义了一个私有状态变量privateVar
、一个内部状态变量internalVar
和一个公共状态变量publicVar
。setVars
函数是一个公共函数,它用于设置这三个状态变量的值。getPrivate
函数是一个私有函数,只能在当前合约中被调用和读取。getInternal
函数是一个内部函数,可以在当前合约及其继承合约中被调用和读取。getPublic
函数是一个公共函数,可以在合约内外被调用和读取。getExternal
函数是一个外部函数,只能在合约外部被调用。
现在,我们可以通过 Remix 调用 setVars
函数来设置这三个状态变量的值,并使用 getPrivate
、getInternal
、getPublic
和 getExternal
函数来检索这些值。
我们可以看到,在调用不同的可见性函数后,成功检索了每个状态变量的值。
- 通常情况下,应该尽可能使用最小的可见性。例如,如果一个状态变量只需要在当前合约中使用,那么应将其声明为
private
。