PHP에서 정적 변수 / 함수를 언제 사용합니까?
PHP로 OOP를 새로 고치고 있으며 함수 및 / 또는 변수를 정적으로 설정하는 예를 보았습니다. 언제 그리고 왜 변수 / 함수를 정적으로 설정합니까? 저는 다른 언어를 사용했고 정적을 사용한 적이 없었습니다. 실제 목적을 찾지 못했습니다. 나는 그것이 무엇을하는지 알고 있지만 왜 대신 변수를 사용하지 않습니까?
인스턴스에 연결되지 않은 메서드 / 변수를 사용 하려면 static 을 사용합니다. 다음과 같은 경우에 발생할 수 있습니다.
목적 및 인스턴스와 관련이 없습니다 (OOP가 Java와 같은 다른 것을 허용하지 않지만 PHP에서는 유용하지 않은 언어의 도구 상자에 유용함).
인스턴스에 대한 액세스를 제어하려고합니다. 대부분의 경우 처리하려는 인스턴스는 코드를 작성할 때 정의되지 않지만 실행됩니다. 싱글 톤 패턴은 가장 좋은 예입니다. 정적 메서드를 팩토리로 사용하여 컨텍스트에 따라 개체를 만들거나 다른 인스턴스와 리소스를 공유 할 수 있습니다. EG : 정적 멤버는 데이터베이스 계층에 대한 액세스 권한을 부여 할 수 있으므로 앱의 일부가 어디서나 동일한 항목에 액세스하고 충돌없이 열리고 닫힙니다.
성능이 중요하며 방법은 여러 번 실행됩니다. 이 경우 인터프리터가 각 호출에서 인스턴스에 대한 멤버를 조회하지 못하도록 CPU 시간을 절약 할 수 있습니다. 그러나 여전히 perfs가이 솔루션에 도달하는 문제가된다면 아키텍처를 재고하거나 코드의 중요한 부분에 대해 더 빠른 언어에 대한 바인딩을 사용할 때가 될 수 있습니다.
유형과 관련된 메소드가 있지만 다른 유형에 적용됩니다. 첫 번째 유형의 선언에 메소드를 작성하는 것이 합리적 일 수 있지만 다른 유형의 인스턴스를 예상하므로 정적으로 설정하십시오.
완벽한 예는 String 파서입니다.
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");
정적 함수와 변수는 다음과 같이 전역 범위의 변수 / 함수에 액세스하는 데 사용됩니다.
echo myClass::myVariable;
echo myClass::myFunction();
무언가가 정적이면 어디에서나 액세스 할 수 있으며 self를 사용할 수 있고 클래스 범위에 포함된다는 점을 제외하면 절차 유형 함수와 매우 유사합니다.
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()
클래스를 가져 오기 위해 호출해야합니다 . 이 함수는 새 클래스를 만들 수 있습니다 (클래스의 구성원이기 때문에). 그런 다음 클래스를 정적 변수에 저장하고 함수를 다시 호출하면 생성 된 클래스 만 반환됩니다.
결국 static 키워드는 범위와 관련하여 사물을 정적으로 유지하는 데 사용됩니다. 현재 범위로 인해 '변경'되는 것을 원하지 않음을 의미합니다. Singleton 방법은 이것을 약간 확장하지만 어떤 범위에 있든 상관없이 항상 '동일한'클래스를 가지고 있다는 동일한 아이디어를 유지합니다.
StackOverflow의 지식
은 어떻게 PHP 글로벌 개체 사용하지 않도록
전역을 사용하지 않고 PHP의 기능 사이에 공유 변수를
클래스 내부의 모든 기능을위한 글로벌 변수 액세스 할 수 있도록
데이터베이스 연결을위한 글로벌 또는 싱글
PHP 클래스 : :: 대를 사용하는 경우 ->?
Also it is very usefull for caching if a method will be called very often and do just the same thing, for example:
/**
* 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;
}
This method will be called within my framework very often and there it will do for every call a database lookup for my configuration $_SERVER key
So while the page is processed i call maybe 10 times in one page load it will have 10 database calls but i changed it to:
/**
* 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;
}
So it just check for every page load one time the normal behaviour if i logged in and cache the result. next time it will just return the cached value. This feature i use very often to have more performance.
Hope this helps.
Here's a random, though fairly good description of the differences between static and instance methods.
From the post:
Instance methods are instance methods because they rely on the state of the specific object instance. Instance methods are tied to a particular instance because the behavior that the method invokes relies upon the state of that particular instance.
When you declare a method as static, you define that method as being a class method. A class method applies to the class as opposed to any particular instance. The behavior instigated by a class method does not rely on the state of a particular instance. In fact, a static method cannot rely on an instance's state since static methods lack access to this reference. Instead, the behavior of a class method either depends on a state that all objects share at the class level, or is independent of any state at all.
If a method relies on an object instance's state it should be an instance methods. If a method is general for all or no instances of a class, and does not rely on the object state, it should be a static method. Instance methods are most commonly used. However static methods are very useful for utility and factory classes amogst many other uses.
Generally using static function you can optimize the speed as well as memory and the scope of method should not be changed its should be static in nature and you can access the objects static properties ,methods without initiating them so saves the memory in mean time.
Static elements have a number of characteristics that can be useful.
First, they are available from anywhere in your script (assuming that you have access to the class). This means you can access functionality without needing to pass an instance of the class from object to object or, worse, storing an instance in a global variable.
Second, a static property is available to every instance of a class, so you can set values that you want to be available to all members of a type.
Finally, the fact that you don’t need an instance to access a static property or method can save you from instantiating an object purely to get at a simple function.
Visit: http://verraes.net/2014/06/when-to-use-static-methods-in-php/
Static methods are nothing more than namespaced global functions. Namespacing, I think we can all agree on, is great. As for global functions: We use those all the time. The native functions in PHP form our basic building blocks.
If you want to share data with all instances, like counter for number of instances created on current execution .
참고URL : https://stackoverflow.com/questions/1257371/when-do-i-use-static-variables-functions-in-php
'development' 카테고리의 다른 글
find 명령에 대한 exec 매개 변수에서 파이프를 어떻게 사용합니까? (0) | 2020.10.27 |
---|---|
O (N log N) 복잡성-선형과 유사합니까? (0) | 2020.10.27 |
TextBox에서 Enter 키 캡처 (0) | 2020.10.27 |
Java GC : 왜 두 개의 생존 지역입니까? (0) | 2020.10.27 |
pom에 정의 된 Maven 속성에 액세스 (0) | 2020.10.27 |