>  기사  >  백엔드 개발  >  객체지향 PHP의 Static 키워드에 대한 자세한 설명(코드 예시)

객체지향 PHP의 Static 키워드에 대한 자세한 설명(코드 예시)

易达
易达원래의
2020-05-25 14:08:081872검색

이 글의 목표:

1. static의 정의와 기능을 이해합니다

2. static의 사용법과 특성을 익히세요

3w1h의 아이디어를 바탕으로 배울 수 있는 지식을 배웁니다. .3w1h

3w1h를 간단히 소개하자면

● 무엇(무엇)

● 왜(왜 사용하는지, 어떤 효과가 있는지)

● 어디서(사용 시나리오)

● 어떻게(구체적으로 사용하는 방법)

(1), 정적 키워드 정의(무엇)

1. static으로 수정되는 속성이나 메서드를 클래스의 정적 멤버라고 합니다

(2) 정적 키워드의 역할(왜)

1. 클래스의 모든 인스턴스는 모두 특정 속성이나 메서드를 공유할 수 있습니다.

(3), 정적 사용 시나리오(여기서)

1 특정 메서드나 속성을 모든 인스턴스에서 공유하려는 경우 정적

을 고려할 수 있습니다. (4), static 자세한 사용법 설명(어떻게)

요약:

1. 정적 속성을 정의하려면 static public $name 과 같이 속성 정의 바로 앞에 static 을 추가하세요. 2. 정적 속성은 다음과 같이 얻을 수 없습니다.

● 클래스 이름::$Attribute name

● 클래스 내부에서는 self::$Attribute name

을 사용할 수 있습니다. 3. 정적 메서드를 정의하려면 다음을 추가하세요. static public function Hello(){ }

와 같이 메서드 정의 바로 앞에 static 4. 정적 메서드는 클래스의 인스턴스를 사용하여 얻을 수 없지만 다음과 같은 방법으로 얻을 수 있습니다.

● 클래스 이름::메서드 이름


● 클래스 내부에서는 self:: 메소드 이름을 통해 얻을 수 있습니다.

5. PHP에서는 static을 사용하여 클래스를 수정할 수 없으며 속성이나 메소드만 수정할 수 있습니다.

6. 내부에서 비정적 속성을 호출할 수 없습니다. 정적 메서드는 정적 속성만 호출할 수 있습니다

7. 정적 메서드 내에서는 비정적 메서드를 호출할 수 없습니다. 메서드는 정적 메서드만 호출할 수 있습니다.

8. 비정적 메서드 내에서는 비정적 속성과 정적 속성을 모두 호출할 수 있습니다.


9. 비정적 메서드 내에서는 비정적 메서드와 정적 메서드를 모두 호출할 수 있습니다.

모든 요약은 실습에서 파생되므로 다음으로 실제 코드를 사용하여 위의 각 요약이 실제로 적용되는지 확인합니다. 맞습니다

(4), 특정 코드

사례 1:

실용 목표:

1. 정적 속성을 정의하려면 속성 정의 바로 앞에 static을 추가합니다(예: static public $name;

2. 정적 속성은 클래스 인스턴스로 얻을 수 없지만 다음과 같은 방법으로 얻을 수 있습니다.

● 클래스 이름::$Attribute name

● 클래스 내부에서 self::$Attribute name

<?php 
 class Human{
    static public $name = "人类";//静态属性的定义
    public function say(){
        echo  "self::name = ".self::$name ."<br/>";
    }
}
//输出静态属性
echo "名称为:".Human::$name."<br/>";
$human = new Human();
$human->say();
?>

을 전달할 수 있습니다. 결과:

객체지향 PHP의 Static 키워드에 대한 자세한 설명(코드 예시)

사례 2:

연습 목표:

1. 정적 메서드를 정의하려면 정적 공용 함수 Hello(){ }

와 같이 메서드 정의 바로 앞에 static을 추가합니다. 2. 정적 메서드는 클래스 인스턴스를 사용하여 얻을 수 없지만 다음과 같은 방법으로 얻을 수 있습니다.

● 클래스 이름::메서드 이름


● 클래스 내부에서 self:: 메서드 이름을 전달할 수 있습니다.

<?php 
 class Human{
    public function __construct(){
        self::staticFun1();
    }
    static public function staticFun1(){
        echo "我是静态方法<br/>";
    }
}
//输出静态方法
Human::staticFun1();
//运行构造函数,看是否可以被正常调用
$human = new Human();

?>

실행 중 결과:

객체지향 PHP의 Static 키워드에 대한 자세한 설명(코드 예시)

사례 3:

연습 목표:

1 php에서는 정적을 사용할 수 없습니다. 클래스 수정은 속성이나 메소드만 수정할 수 있습니다.

<?php 
static class Human{
   
}
?>

실행 결과:

구문 분석 오류: 구문 오류, 예상치 못한 '클래스'(T_CLASS), 2행의 D:E-classclass-codeclassingindex.php에 ::(T_PAAMAYIM_NEKUDOTAYIM)이 필요합니다

사례 4:

연습 목표:

1. 정적 메서드 내에서는 호출할 수 없으며 정적 속성만 호출할 수 있습니다.

<?php 
class Human{
    static public $staticName = "静态属性-人类";
    public $commonName="非静态属性-人类";
    
    //定义静态方法 静态方法调用非静态属性
    static public function staticFun1(){
        echo $this->commonName."<br/>";
        
    }
    //测试静态方法调用静态属性
    static public function staticFun2(){
        echo self::$staticName."<br/>";
        
    }
}
Human::staticFun2();//OK
Human::staticFun1();//not OK
?>

실행 결과는 다음과 같습니다.

Static Property - Human

치명적인 오류: Uncaught Error: Using $this when not in object context in D:E-classclass- codeclassingindex.php:8 스택 추적: #0 D:E-classclass-codeclassingindex.php(18): Human::staticFun1() #1 {main }이 8행의 D:E-classclass-codeclassingindex.php에 던져졌습니다

사례 5:

실제 목표:

1. 정적 메서드는 내부에서 비정적 메서드를 호출할 수 없으며 정적 메서드만 호출할 수 있습니다.

<?php 
class Human{
   
    //定义静态方法 
    //测试静态方法调用 静态方法
    static public function staticFun1(){
        self::staticFun2();
        $this->commonFun1();
    }
    static public function staticFun2(){
        echo "我是静态方法2<br/>";
    }
    //普通方法
    public function commonFun1(){
        echo "我是普通方法1<br/>";
    }

    
}
Human::staticFun1();
?>

실행 결과:


저는 정적 메서드 2입니다

Fatal error: Uncaught Error: Using $this when not in object context in D:\E-class\class-code\classing\index.php:8 Stack trace: #0 D:\E-class\class-code\classing\index.php(20): Human::staticFun1() #1 {main} thrown in D:\E-class\class-code\classing\index.php on line 8

案例六:

实践目标:

1、非静态方法内部,既可以调用非静态属性也可以调用静态属性

<?php 
class Human{
    static public $staticName = "静态属性-人类";
    public $name = "非静态属性-人类";

    ///普通方法
    public function commonFun1(){
       echo self::$staticName."<br/>";
       echo $this->name."<br/>";
    }

}
$human = new Human();
$human->commonFun1();
?>

运行结果为:

静态属性-人类
非静态属性-人类

案例七:

实践目标:

1、非静态方法内部,既可以调用非静态方法也可以调用静态方法

<?php 
class Human{
    ///普通方法
    public function commonFun1(){
       self::staticFun1();
       $this->commonFun2();
    }

    //测试静态方法调用 静态方法
    static public function staticFun1(){
        echo "我是静态方法1<br/>";
    }
    public function commonFun2(){
        echo "我是普通方法2<br/>";
    }
}
$human = new Human();
$human->commonFun1();
?>

运行结果为:

我是静态方法1
我是普通方法2

(五)、学以致用

问题:

    1、所有的NBA球员都有一个共同的联盟总裁,David Stern(大卫*斯特恩)

    2、总裁换成了“Adam Silver” 怎么办?

     大家自己思考一下,再看后面的结果

.........................

答案揭晓:

思路分析:

1、“换”是一个动词,换总裁,所以是一个方法,而总裁是一个数据,所以是一个属性

2、换总裁要达到一个目的就是,换了以后,这个对象仍然要被其他所有的NBA球员对象使用到

3、既然 总裁 (属性) 要被所有的NBA球员对象 共享,那么我们就可以结合static的作用,将总裁属性定义为静态属性

4、所以根据综上所述,大概的思路就是定义一个NBA球员类,然后类里面主要有静态属性“总裁”和一个 换总裁 的方法

具体代码如下:

<?php 
//Nba球员类
class NbaPlayer{
    public $name = "";
    //构造函数初始化对象
    public function __construct($name){
        $this->name = $name;
    }
    //总裁
    static public $president = "David Stern";

    //换总裁方法
    public function changePresident($name){
      self::$president = $name;
    }

}
$jordon = new NbaPlayer("乔丹");
$kebo = new NbaPlayer("科比");
echo "输出他们目前共同的总裁,总裁为:".NbaPlayer::$president."<br/>";

echo "现在把乔丹总裁换成Adam Silver<br/>";
$jordon->changePresident("Adam Silver");
echo "输出科比的总裁是否也和乔丹的一样,科比总裁为:".NbaPlayer::$president."<br/>";
?>

运行结果为:

输出他们目前共同的总裁,总裁为:David Stern
现在把乔丹总裁换成Adam Silver
输出科比的总裁是否也和乔丹的一样,科比总裁为:Adam Silver

总结:

1、本文主要是讲了static关键字的定义和特点

希望本文能给大家带来一定的帮助,谢谢!!!

위 내용은 객체지향 PHP의 Static 키워드에 대한 자세한 설명(코드 예시)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.