关于PHP静态方法调用和实例化类调用的区别

1.首先来澄清一些观点

  由于静态方法在内存中只有一份,无论你调用多少次,都是共用的,而且没有对象的概念,所以不能在静态方法里面使用$this调用,如果非得调用的话,只能实例化自身类

  而实例化不一样,每一个实例化是一个对象,在内存中是多个的

<?php
Error_reporting(E_ALL|E_STRICT);

class A{

    public function bar(){
        echo ‘bar‘.PHP_EOL;
    }
    public static function foo(){
        echo ‘foo‘.PHP_EOL;
    }
}

A::bar();//会报错
A::foo();//正确$obj = new A();$obj -> foo();//正确
/*   bar()是一个非静态方法,应该由对象来调用,但用静态来调用此方法也可以执行,而严格状态下,此方法会执行,同时报错,   Strict Standards: Non-static method Human::easyeat() should not be called statically in........  但是实例化的类是可以调用静态方法的。*/
<?php

class A{
    public $name = ‘zongshuai‘;

    public function bar(){
        echo ‘bar‘.PHP_EOL;
    }
    public static function foo(){
        echo self::$name.PHP_EOL;//报错
    }
}

A::foo();

/*
    静态方法不能调用非静态属性 。不能使用self::调用非静态属性。
*/
总结: 类》访问->静态方法(类的方法)->可以 类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)对象》访问》静态方法(类的方法)->可以 对象》访问》普通方法(对象的方法)->可以
时间: 2024-10-05 00:38:42

关于PHP静态方法调用和实例化类调用的区别的相关文章

波哥学JAVA,定义类 创建对象 实例化对象 属性 类调用属性或者方法

定义类 声明对象  创建对象 实例化对象 属性 对象调用属性或者方法 举例,下面定义类了一个类并声明属性,写了一个方法: 创建对象 实例化对象 属性 类调用属性或者方法

c#委托声明实例化与调用

系统访问数据或调用方法有两种操作方式:一种是通过名称访问或调用,另一种是通过所在的内存地址来访问调用.为了系统的安全与稳定,NET Framework的CLR库不允许程序通过指针来直接操作内存中数据或方法,而是通过托管机制来访问内存中数据或调用内存中的方法.委托就是C#提供的一种以托管机制调用方法的特殊数据类型,其作用于房屋租凭中介机构类似. 下面我们要所的主要围绕以下三点 //1.定义委托 //2.委托的实例化 //3.委托的调用,实际上是将委托指向已经实现的某个方法 //注意:调用的方法必须

C#中派生类调用基类构造函数用法分析

这里的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class MyBaseClass { } public class MyDerivedClass : MyBaseClass {   public MyDerivedClass()   {    Console.WriteLine("我是子

关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题

通常,我们在java中通过实例化一个类来调用该类的方法,但是,如果有多个类都要调用这个类地方法,是不是要在每个主调类里面都创建一个被调用类的对象呢? 如果这样做,会不会因为多次实例化而影响程序的执行效果呢? 答案是:没必要多次创建被调用类的对象,而且多次实例化还可能会影响程序执行效果. 解决问题的办法是:在每一个主调类里面各写一个构造方法,形参是被调用类的对象, public ShopCartItem(ShopCart shopcart) { super(); this.shopcart=sho

java 实例化是调用了子类重写方法

java 实例化时调用了抽象方法或者class里面某个方法,如果子类有重写改方法,实际运行的是子类重写方法 package auto.test; //抽象父类 public abstract class Father { public Father() { // TODO Auto-generated constructor stub oupPut(); //实例化时调用,子类有,就调用子类方法,子类没有,就调用父类方法 } //父类抽象方法,让子类重写 public void oupPut()

CI框架中一个类中调用另一个类中已经加载对象测试

controller.php 1 <?php 2 class CI_Controller { 3 4 private static $instance; 5 6 public function __construct() 7 { 8 self::$instance =& $this; 9 10 foreach (is_loaded() as $var => $class) 11 { 12 $this->$var =& load_class($class); 13 $obj

JniHelper调用java静态和非静态方法总结(即cocos2dx中调用android平台下显示第三方广告)

调用非静态方法首先就是调用的静态方法得到要调用的java的类对象然后通过调用minfo.env->CallVoidMethod(activityObj, minfo.methodID);方法把对象和要调用的方法以及参数(如果有 )传递个java类对象中的非静态方法: java类: // c++中調用的方法public static Object rtnActivity() {System.out.println("----------rtnActivity");return ma

转 关于C#中派生类调用基类构造函数的理解

关于C#中派生类调用基类构造函数的理解 .c#class       本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.  当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数 Ex: public class MyBaseClass    {    } public class MyDerivedClass : MyBaseClass    {        public MyDerivedClass()        {            Con

cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 print(foo(99)) a.c 文件 #include <lua.h> #include <lualib.h> #include <lauxlib.h> int foo(lua_State *L) { int n = lua_tonumber(L, 1); lua_pushnumber(L, n + 1); return 1; } int main() { lua_State *L = lua_ope