我爽快自己对OOP PHP和我看到的设置功能和/或变量作为静态的例子。 什么时候和为什么我会设置一个变量/函数,静态的? 我已经做了其他语言和以往任何时候都使用静态真的不记得,我从来没有发现一个真正的目的吧。 我知道它做什么,但为什么不直接使用一个变量来代替?
Answer 1:
当你想使用的方法/变量是不依赖于一个实例可以使用静态的 。 这可能发生在:
没有与你的目的和实例(在语言,不允许其他任何OOP像Java工具箱是有用的,但是在PHP没有用)没有任何关系。
你想控制访问的实例。 大多数情况下,比如你要处理的时候你写的代码是没有定义,但会在执行。 的单例模式是最好的例证。 您可以使用静态方法作为工厂按照与其他实例上下文或共享资源创建一个对象。 EG:一个静态成员可以给访问数据的基础层,因此该应用的一部分,访问来自任何地方的同一个和它的打开/无冲突地关闭。
表演物质和方法将被执行了很多次。 在这种情况下,你会节省一些CPU时间防止解释从成员在每次调用寻找到一个实例。 但尽管如此,如果perfs成为你来到这个解决这样的问题,可能时机,重新考虑你的架构,或结合的代码的关键部分更快的语言环境中使用的。
您有相关的类型,但将被应用到其他的方法。 它可以是有意义的编写方法为第一型的声明,但其设置静态的,因为它预计另一个实例。
最好的例子是一个字符串解析器:
class MyObject
{
static function parse($str)
{
$obj = new MyObject();
// some parsing/setting happens here
return $obj;
}
}
// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");
Answer 2:
静态函数和变量被用于访问变量/函数在全球范围内,这样的:
echo myClass::myVariable;
echo myClass::myFunction();
当事情是一成不变的,它可以在任何地方访问,是非常相似的程序类型的功能,它除了可以使用自己和包含在类的范围。
class myClass{
static $myVariable = "myVar";
static function myFunction()
{
return "myFunc";
}
}
其中一个使用这种方式是保持一个类,或一个Singleton方法只有一个实例。
class myClass
{
static $class = false;
static function get_connection()
{
if(self::$class == false)
{
self::$class = new myClass;
}
else
{
return self::$class;
}
}
private function __construct()
{
// my constructor
}
// Then create regular class functions.
}
因为它有一个私人的构造函数,它不能用实例化的new
运营商,所以你不得不调用myClass::get_connection()
获取类。 该功能可以使新类(因为它是类的成员)。 然后,它存储在一个静态变量的类,如果你再次调用该函数,它只会返回创建的类。
在结束时,将静态关键字用于使事情,那么,静态的,在参考范围内。 这意味着你什么都不想,因为当前范围的“改变”。 虽然辛格尔顿方法绵延这一点,它与你总是有“相同”类同样的想法保持,不管你是在什么范围之内。
PHP文件
static关键字
范围解析操作符
StackOverflow的知识
怎样避免使用PHP全局对象
在PHP函数间共享变量,但不使用全局
使全局变量访问一类内的每个功能
全球或辛格尔顿数据库连接
PHP类:何时使用::主场迎战- >?
Answer 3:
此外,它是非常有用的缓存,如果一个方法会非常频繁调用,并做一样的事情,例如:
/**
* Returns true if the user is logged in through shibboleth
*
* @return boolean true on success, else false
*/
protected function is_logged_in() {
//Check shibboleth headers
if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
return true;
}
}
return false;
}
此方法将我的框架内经常被调用,那里将做每调用数据库查找我的配置$ _ SERVER关键
因此,尽管在处理页面调用我也许10倍于一个页面加载将有10个数据库调用,但我把它改为:
/**
* Returns true if the user is logged in through shibboleth
*
* @return boolean true on success, else false
*/
protected function is_logged_in() {
static $logged_in = null;
if($logged_in != null) {
return $logged_in;
}
//Check shibboleth headers
if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
$logged_in = true;
return true;
}
}
$logged_in = false;
return false;
}
所以它只是检查每个页面加载一次正常的行为,如果我登录和缓存结果。 下一次它只是返回缓存值。 这个功能我经常使用有更多的表现。
希望这可以帮助。
Answer 4:
这里有一个随机的,虽然静态和实例方法之间的差异相当不错的描述 。
从帖子:
实例方法实例方法,因为它们依赖于特定对象实例的状态。 因为该方法调用的行为依赖于该特定实例的状态的实例方法是依赖于特定的实例。
当你声明的方法为静态的,可以定义方法为一个类的方法。 一类方法适用于类作为反对任何特定实例。 一类方法煽动行为不依赖于某一特定实例的状态。 事实上,静态方法不能靠一个实例的状态,因为静态方法无法获得此引用。 相反,类方法的行为既取决于所有对象在类级别共享的状态,或者是独立于任何国家都没有。
如果一个方法依赖于一个对象实例的状态应该是一个实例方法。 如果一个方法是通用的全部或任何一个类的实例,并且不依赖于对象的状态,它应该是一个静态方法。 最常使用的实例方法。 但是静态方法是实用和工厂类amogst许多其他用途非常有用的。
Answer 5:
一般使用静态功能,您可以优化速度,以及内存和方法的范围不应该改变它应该在本质上是静态,您可以访问对象的静态属性,方法,而无需启动它们,以便节省平均时间内存。
Answer 6:
静态元素具有许多特点,可以是有用的。
首先,他们可以从脚本中任何(假设你有访问类)。 这意味着你可以无需通过从对象的类为对象,或者更糟糕的情况下,在全局变量存储实例访问功能。
其次,静态属性是提供给类的每个实例,所以你可以设置要提供给一个类型的所有成员的值。
最后,你并不需要一个实例的事实来访问静态属性或方法可以节省你从纯粹的实例化一个对象来获取一个简单的功能。
Answer 7:
访问: http://verraes.net/2014/06/when-to-use-static-methods-in-php/
静态方法只不过是全球命名空间功能的更多。 命名空间,我想我们都同意,是伟大的。 对于全局函数:我们使用这些所有的时间。 在PHP中的原生功能,构成了我们的基本组成部分。
Answer 8:
如果你想与所有实例共享数据,如柜台上当前执行创建的实例数。