`
dimingchan
  • 浏览: 54907 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

PHP中静态方法(static)与非静态方法的使用及区别

 
阅读更多
static关键字用来修饰属性、方法,称这些属性、方法为静态属性、静态方法。

static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”

如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用。

static关键字可以用来修饰变量、方法。

不经过实例化,就可以直接访问类中static的属性和static的方法。

static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调

用。

static的属性,在内存中只有一份,为所有的实例共用。

使用self:: 关键字访问当前类的静态成员。

一个类的所有实例,共用类中的静态属性。

也就是说,在内存中即使有多个实例,静态的属性也只有一份。

下面例子中的设置了一个计数器$count属性,设置private 和 static 修饰。

这样,外界并不能直接访问$count属性。而程序运行的结果我们也看到多个实例在使用同一个静态的$count 属性。

<?php     
class user   
{     
    private static $count = 0 ; //记录所有用户的登录情况.     
    public function __construct() {     
        self::$count = self::$count + 1;     
    }     
    public function getCount() {       
        return self::$count;     
    }     
    public function __destruct() {     
        self::$count = self::$count - 1;     
    }     
}     
$user1 = new user();     
$user2 = new user();     
$user3 = new user();     
echo "now here have " . $user1->getCount() . " user";     
echo "<br />";     
unset($user3);     
echo "now here have " . $user1->getCount() . " user";     
?>  
 

静态属性直接调用
静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。

使用的方式是: 类名::静态属性名

<?php     
class Math   
{     
    public static $pi = 3.14;     
}     
// 求一个半径3的园的面积。     
$r = 3;     
echo "半径是 $r 的面积是<br />";     
echo Math::$pi * $r * $r;     
echo "<br /><br />";     
//这里我觉得 3.14 不够精确,我把它设置的更精确。     
Math::$pi = 3.141592653589793;     
echo "半径是 $r 的面积是<br />";     
echo Math::$pi * $r * $r;      
?>    



类没有创建,静态属性就可以直接使用。那静态属性在什么时候在内存中被创建? 在PHP中没有看到相关的资料。引用Java中的概念,来解释应该也具有通用性

。静态属性和方法,在类被调用时创建。

静态方法
静态方法不需要所在类被实例化就可以直接使用。

使用的方式是类名::静态方法名

下面我们继续写这个Math类,用来进行数学计算。我们设计一个方法用来算出其中的最大值。既然是数学运算,我们也没有必要去实例化这个类,如果这个方法

可以拿过来就用就方便多了。我们这只是为了演示static方法而设计的这个类。在PHP提供了 max() 函数比较数值。

view plaincopy to clipboardprint?
<?php     
class Math   
{     
    public static function Max($num1, $num2) {     
        return $num1 > $num2 ? $num1 : $num2;     
    }          
}     
$a = 99;     
$b = 88;     
echo "显示 $a 和 $b 中的最大值是";     
echo "<br />";     
echo Math::Max($a, $b);     
echo "<br />";   
echo "<br />";   
echo "<br />";     
$a = 99;     
$b = 100;     
echo "显示 $a 和 $b 中的最大值是";     
echo "<br />";     
echo Math::Max($a,$b);     
?>   


静态方法如何调用静态方法
第一个例子,一个静态方法调用其它静态方法时,使用self::

<?php     
// 实现最大值比较的Math类。     
class Math   
{     
    public static function Max($num1, $num2) {     
        return $num1 > $num2 ? $num1 : $num2;     
    }     
    public static function Max3($num1, $num2, $num3) {     
        $num1 = self::Max($num1, $num2);     
        $num2 = self::Max($num2, $num3);     
        $num1 = self::Max($num1, $num2);             
        return $num1;     
    }     
}     
$a = 99;     
$b = 77;     
$c = 88;     
echo "显示 $a $b $c 中的最大值是";     
echo "<br />";     
echo Math::Max3($a, $b, $c);     
?> 




静态方法调用静态属性
使用self:: 调用本类的静态属性。

<?php     
//      
class Circle   
{     
    public static $pi = 3.14;     
    public static function circleAcreage($r) {     
        return $r * $r * self::$pi;     
    }     
}     
$r = 3;     
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);     
?>  
 


静态方法不能调用非静态属性 。不能使用self::调用非静态属性。

<?php     
// 这个方式是错误的     
class Circle   
{     
    public $pi = 3.14;     
    public static function circleAcreage($r) {     
        return $r * $r * self::pi;     
    }     
}     
$r = 3;     
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);     
?>
  


也不能使用 $this 获取非静态属性的值。

静态方法调用非静态方法
PHP5中,在静态方法中不能使用 $this 标识调用非静态方法。

<?php   
// 实现最大值比较的Math类。     
class Math   
{         
    public function Max($num1, $num2) {     
        echo "bad<br />";             
        return $num1 > $num2 ? $num1 : $num2;     
    }     
    public static function Max3($num1, $num2, $num3) {     
        $num1 = $this->Max($num1, $num2);     
        $num2 = $this->Max($num2, $num3);     
        $num1 = $this->Max($num1, $num2);             
        return $num1;     
    }     
}     
$a = 99;     
$b = 77;     
$c = 188;     
echo "显示 $a $b $c 中的最大值是";     
echo "<br />";     
echo Math::Max3($a, $b, $c);    //同样的这个会报错    
?>   


当一个类中有非静态方法被self:: 调用时,系统会自动将这个方法转换为静态方法。

<?php     
// 实现最大值比较的Math类。     
class Math   
{         
    public function Max($num1, $num2) {            
        return $num1 > $num2 ? $num1 : $num2;     
    }     
    public static function Max3($num1, $num2, $num3) {     
        $num1 = self::Max($num1, $num2);     
        $num2 = self::Max($num2, $num3);     
        $num1 = self::Max($num1, $num2);             
        return $num1;     
    }     
}     
$a = 99;     
$b = 77;     
$c = 188;     
echo "显示 $a $b $c 中的最大值是";     
echo "<br />";     
echo Math::Max3($a, $b, $c);     
?> 
分享到:
评论

相关推荐

    PHP中静态方法(static)与非静态方法的使用及区别.docx

    理解静态方法和非静态方法的使用和区别是掌握PHP面向对象编程的关键。 静态方法是通过类名直接调用的,无需创建类的实例。这使得它们在某些情况下非常有用,比如当一个方法不需要访问类的实例变量,或者当需要在类...

    PHP中的静态变量及static静态变量使用详解

    静态变量不仅可以在函数中使用,还可以作为类的静态属性使用。静态属性是属于类本身的,而不是类的某个实例。这意味着静态属性在所有实例之间共享。例如: ```php class Nowamagic { public static $nm = 1; ...

    浅析php静态方法与非静态方法的用法区别

    静态方法和非静态方法的主要用法区别体现在以下几个方面: 1. 访问限制:静态方法不能直接访问非静态的属性和方法,因为静态成员是属于类级别的,而非静态成员是属于对象实例级别的。由于静态成员的创建和调用不...

    php面对对象中static静态属性和静态方法的调用_.docx

    4. 静态方法可以调用非静态方法,但需避免使用 `$this`,可使用 `self::` 或通过实例调用来实现。 了解这些基础知识后,开发者可以更好地利用静态属性和方法来优化代码结构,特别是在处理全局状态、单例模式或者...

    浅析php静态方法与非静态方法的用法区分_.docx

    在PHP编程中,静态方法和非静态方法是两种不同的成员函数类型,它们有着明显的区别和各自的使用场景。静态方法的特点在于它们与类关联,而非与类的实例关联,这意味着你可以直接通过类名来调用静态方法,而无需先...

    PHP静态调用非静态方法的应用分析

    在PHP编程语言中,静态调用非静态方法是一种特殊情况,虽然在Java或C#等静态类型语言中会被编译器捕获并报错,但在PHP这样的动态语言中却是可行的,尽管并不推荐。PHP允许这样的调用主要是为了保持向后兼容,尤其是...

    浅谈PHP中静态方法和非静态方法的相互调用

    在PHP编程语言中,类的方法可以被分为静态方法(static methods)和非静态方法(non-static methods)。理解这两种类型方法的差异以及它们之间如何相互调用对于编写面向对象的代码非常重要。 首先,我们来介绍静态...

    PHP中静态属性静态方法的用法

    `result()`方法则是一个非静态方法,它内部调用了`compare()`方法来找出三个数中的最大值。 #### 直接调用静态属性和静态方法 除了通过类的实例来访问静态属性和静态方法之外,还可以直接通过类名来访问。 ```php...

    php中静态类与静态变量用法类.zip

    分析了php中静态类与静态变量用法类的区别,创建对象$object = new Class(),然后使用”-&gt;”调用:$object-&gt;attribute/function,前提是该变量/方法可访问。直接调用类方法量:class::attribute/function,无论是静态/...

    PHP面向对象之旅深入理解static变量与方法

    - 静态方法不能访问非静态方法或变量,因为它们可能依赖于实例的特定状态。 总之,`static`关键字在PHP中提供了对类静态成员的支持,使得开发者可以编写更加灵活且高效的代码。理解和正确使用静态变量和方法对于...

    php面向对象中static静态属性和静态方法的调用

    ### 静态方法与非静态方法的交互 虽然静态方法不能直接访问非静态属性,但它们可以调用非静态方法。在调用非静态方法时,需要通过`self`关键字将其转换为静态,如下所示: ```php class ClassName { static ...

    PHP类的静态(static)方法和静态(static)变量使用介绍

    3. 尽管可以使用`class::...`调用非静态方法,但必须确保该方法不依赖实例变量,否则会导致错误。 静态成员的存在使得开发者能够在不创建对象的情况下与类进行交互,这对于轻量级操作和不需要实例化对象的场景非常...

    php之static静态属性与静态方法实例分析

    在PHP编程语言中,静态属性(Static Properties)和静态方法(Static Methods)是面向对象编程中的重要概念,它们可以让我们在不创建类的实例的情况下使用属性和方法,从而实现一些特殊的功能和用途。 静态属性是指...

    PHP使用静态方法的几个注意事项

    4. **静态与非静态方法的交互**: 静态方法可以调用非静态方法,反之则不行。如果尝试在静态方法中调用非静态方法,会导致错误,因为非静态方法需要对象实例来调用。 5. **静态属性**: 类的静态属性同样不依赖于...

    php中const与static的区别与使用共3页.pdf

    静态变量与普通成员变量(非静态)的最大区别在于它的生命周期。普通成员变量在每次对象实例化时都会创建新的副本,而静态变量只会在第一次调用时初始化,并在整个类的生命周期内共享,不随对象的创建销毁而变化。...

    PHP面向对象之旅深入理解static变量与方法共11页

    本资料“PHP面向对象之旅深入理解static变量与方法”旨在帮助开发者深入理解PHP中的静态(static)变量和静态方法,这些都是OOP的重要组成部分。下面我们将详细探讨这两个概念。 1. 静态变量 静态变量是在类中定义...

    详解php用static方法的原因

    静态方法不需要所在类被实例化就可以直接使用。 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个...

    php中const与static的区别与使用共3页.pdf.zip

    4. **复用性**:在类的方法中,非静态变量每个实例都有自己的一份副本,而静态变量所有实例共享同一份。 例如: ```php class MyClass { public static $counter = 0; public function incrementCounter() { ...

Global site tag (gtag.js) - Google Analytics