1. static의 정의와 기능을 이해합니다
2. static의 사용법과 특성을 익히세요
3w1h의 아이디어를 바탕으로 배울 수 있는 지식을 배웁니다. .3w1h
3w1h를 간단히 소개하자면
● 무엇(무엇)
● 왜(왜 사용하는지, 어떤 효과가 있는지)
● 어디서(사용 시나리오)
● 어떻게(구체적으로 사용하는 방법)
1. static으로 수정되는 속성이나 메서드를 클래스의 정적 멤버라고 합니다
1. 클래스의 모든 인스턴스는 모두 특정 속성이나 메서드를 공유할 수 있습니다.
1 특정 메서드나 속성을 모든 인스턴스에서 공유하려는 경우 정적
요약:
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(); ?>
을 전달할 수 있습니다. 결과:
사례 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(); ?>
실행 중 결과:
사례 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에 던져졌습니다
실제 목표:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!