> 백엔드 개발 > PHP 문제 > PHP에서 정적 메소드를 사용하는 방법

PHP에서 정적 메소드를 사용하는 방법

青灯夜游
풀어 주다: 2023-03-11 19:56:01
원래의
6730명이 탐색했습니다.

PHP에서는 static 키워드로 수정된 멤버 메서드를 정적 메서드라고 합니다. 정적 메서드를 호출하려면 "클래스 이름::정적 메서드()" 구문을 사용하거나 변수를 직접 인스턴스화한 후 " 변수 이름" -> 함수 이름" 메소드 호출.

PHP에서 정적 메소드를 사용하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP에서는 static 키워드로 수정된 멤버 속성과 멤버 메서드를 정적 속성과 정적 메서드라고 합니다. 여기서는 클래스의 정적 멤버는 클래스의 일반 멤버와 다릅니다. 정적 멤버는 개체로 인스턴스화되지 않습니다. 즉, 클래스를 통해 정적 멤버에 액세스하기 위해 클래스를 인스턴스화할 필요가 없습니다. .

클래스에서 정적 변수를 선언하는 것은 쉽습니다. 클래스의 일반 멤버 앞에 정적 키워드를 추가하여 이 일반 멤버를 정적 멤버로 바꿀 수 있습니다. 이런 방식으로 클래스를 인스턴스화하지 않고도 클래스의 정적 멤버에 직접 액세스할 수 있습니다. 정적 멤버에 액세스하기 위한 구문 형식은 다음과 같습니다.

类名::$静态属性
类名::静态方法()
로그인 후 복사

:: 기호는 범위 확인 연산자라고 하며 정적 멤버, 정적 메서드 및 상수에 액세스하는 데 사용되며 사용할 수도 있습니다. 클래스 및 메서드의 멤버를 재정의합니다. ::符号被称为范围解析操作符,用于访问静态成员、静态方法和常量,还可以用于覆盖类中的成员和方法。

或者直接实例化一个变量,然后使用“变量名->函数名

또는 변수를 직접 인스턴스화한 다음 "변수 이름->함수 이름" 메서드를 사용하여 호출하세요.

정적 메서드는 클래스 인스턴스화 없이 호출할 수 있고 일반 메서드와 일반 속성은 액세스하기 전에 개체를 선언해야 하므로 정적 메서드에서는 일반 메서드와 일반 변수를 사용할 수 없습니다.

정적 메서드에 대해 명심해야 할 한 가지: "정적 메서드는 전체 클래스에 속합니다."

class Star{
public static function getName($name){
return '队员姓名'.$name;
}
}
echo Star::getName('kate');  //队员姓名kate
$star = new Star();
echo $star->getName('jim');  //队员姓名jim
로그인 후 복사
정적 메서드의 장점:

(1) 코드의 어느 곳에서나 사용할 수 있습니다(액세스할 수 있다고 가정).

(2) 클래스의 각 인스턴스는 클래스에 정의된 정적 속성에 액세스할 수 있으며 정적 속성을 사용하여 클래스의 모든 개체에서 사용할 수 있는 값을 설정할 수 있습니다. 개체가 필요합니다. 정적 속성이나 메서드에 액세스할 수 있습니다.

<?php
$pdo = new PDO(&#39;mysql:host=localhost;dbname=mydb&#39;,&#39;root&#39;);  // 生成一个 PDO(PHP Data Object) 对象
class ShopProduct{
    private $title;             // 属性也称为成员变量,用来存放对象之间互不相同的数据
    private $producerMainName;  // 所有的属性都设置为 private,不允许外部直接访问这些属性,然后提供方法来取得需要的值
    private $producerFirstName;
    protected $price;           // 阻止外面直接访问该属性,可以被子类访问
    private $discount = 0;
    private $id = 0;

    // 创建对象时,构造方法会被自动调用,构造方法可以确保必要的属性设置,并完成任何需要准备的工作
    public function __construct($title,$mainName,$firstName,$price){
        $this->title = $title;      // 使用伪变量$this给每个变量赋值
        $this->producerMainName = $mainName;
        $this->producerFirstName = $firstName;
        $this->price = $price;
    }

    /**
     * @return mixed 这种只返回属性值的方法称为“访问方法”,也称为 getter 和 setter
     */
    public function getProducerFirstName()
    {
        return $this->producerFirstName;
    }

    /**
     * @return mixed 获取 姓 的访问方法
     */
    public function getProducerMainName()
    {
        return $this->producerMainName;
    }

    /**
     * @param $num 打折的价格
     */
    public function setDiscount($num)
    {
        $this->discount = $num;
    }

    /**
     * @return int 折扣的访问方法
     */
    public function getDiscount()
    {
        return $this->discount;
    }

    /**
     * @return mixed Book名或CD名的访问方法
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @return mixed 折扣后的价格
     */
    public function getPrice()
    {
        return ($this->price - $this->discount);
    }

    /**
     * @return string 作者
     */
    public function getProducer(){  // 方法让对象执行任务
        return $this->producerMainName .&#39; &#39;. $this->producerFirstName;
    }

    /**
     * @return string 发票的摘要信息
     */
    public function getSummaryLine()
    {
        $base = "{$this->title} ( {$this->producerMainName},{$this->producerFirstName}) ";
        return $base;
    }

    /**
     * @param $id id 的访问方法, setter
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    // 根据查询数据的数据类型,返回特定类型的 ShopProduct 对象,这个方法没有使用任何实例的属性和方法,因此把它定义为一个静态方法(static),只要有一个有效的 PDO 对象,就可以在程序的任何地方调用这个方法。这个方法就像工厂一样,可以接受原始数据产生特定类型的对象。
    public static function getInstance($id,PDO $pdo)
    {
        $stmt = $pdo -> prepare("SELECT * FROM products WHERE id=?");
        $stmt -> execute(array($id));
        $row = $stmt -> fetch();
        if(empty($row)){
            return null;
        }
        switch($row[&#39;type&#39;])
        {
            case &#39;book&#39; :
                $product = new BookProduct($row[&#39;title&#39;],$row[&#39;first_name&#39;],$row[&#39;main_name&#39;],$row[&#39;price&#39;],$row[&#39;num_pages&#39;]);
            break;
            case &#39;cd&#39; :
                $product = new CdProduct($row[&#39;title&#39;],$row[&#39;first_name&#39;],$row[&#39;main_name&#39;],$row[&#39;price&#39;],$row[&#39;play_length&#39;]);
            break;
            default :
                $product = new ShopProduct($row[&#39;title&#39;],$row[&#39;first_name&#39;],$row[&#39;main_name&#39;],$row[&#39;price&#39;]);
            break;
        }
        $product -> setId($row[&#39;id&#39;]);
        $product -> setDiscount($row[&#39;discount&#39;]);
        return $product;
    }
}

// 若派生类没有定义构造方法,则它在实例化是会自动调用父类的构造方法。子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性
class BookProduct extends ShopProduct
{
    private $numPages;

    // 每个子类在设置自己的属性前调用父类的构造方法,基类现在仅知道自己的数据,子类一般是父类的特列,应该避免告诉父类任何关于子类的消息。
    public function __construct($title,$mainName,$firstName,$price,$numPages)
    {
        // parent 关键字可以在任何复写父类方法的方法中使用,通过在当前对象中调用父类的方法来拓展父类的功能 , 要应用一个类而不是对象的方法,使用 :: 而不是 ->
        parent::__construct($title,$mainName,$firstName,$price);
        $this -> numPages = $numPages;
    }

    /**
     * @param $numPages 书的页数
     * @return mixed    总页数
     */
    public function getNumberOfPages()
    {
        return $this->numPages;
    }

    /**
     *  子类(派生类)可以覆盖和修改父类(基类或超类)的功能
     * @return string Book发票的摘要信息
     */
    public function getSummaryLine()
    {
        $base = parent::getSummaryLine();
        $base .= "page count - {$this->numPages}";
        return $base;
    }
}

class CdProduct extends ShopProduct
{
    private $playLength;

    public function __construct($title,$mainName,$firstName,$price,$playLength)
    {
        parent::__construct($title,$mainName,$firstName,$price);
        $this -> playLength = $playLength;
    }

    /**
     * @return int 播放时间
     */
    public function getPlayLength()
    {
        return $this -> playLength;
    }

    /**
     * @return string CD发票的摘要信息
     */
    public function getSummaryLine()
    {
        $base = parent::getSummaryLine();
        $base .= "playing time - {$this->playLength}";
        return $base;
    }
}

$product = ShopProduct::getInstance(1,$pdo);     // 该静态方法根据传入 id 的不同生成特定类型的对象
if($product){
    print "author : {$product -> getProducer()} </br>";              // author :Lun Xun
    print "summary line: {$product -> getSummaryLine()}</br>";      // summary line: Kong Yiji ( Xun,Lun) page count - 200
}
로그인 후 복사
추천 학습: "

PHP 비디오 튜토리얼"

위 내용은 PHP에서 정적 메소드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿