Heim >Backend-Entwicklung >PHP-Tutorial >关于静态方法和属性
目录Table Of Contents
静态方法和属性,其实就是通过类而不是通过对象来访问数据和功能。
面向对象编程中的实际操作都是通过类的实例(而不是类本身)完成的,毕竟类只是实例的模板。但是我们可以通过static来访问类的方法和属性,这相当于就是静态的,没有动态的实例化类,而是静态的直接调用。
静态方法是以类为作用域的函数,静态方法不能访问这个类中的普通属性,因为这些属性是属于一个对象的,但可以访问静态属性。
因为通过类而不是实例来访问静态元素,所以访问静态元素时不需要引用对象的变量,而是使用双冒号 ::来访问。
StaticExample::sayHello();
一个子类可以用parent关键字来访问父类,而不使用其类名。要从类(不是子类)中访问静态方法和属性,可以使用self关键字,self指向当前类,就像$this指向当前对象一样。
1.因为他们在代码中任务地方都可用,也就是说,你不需要再对象间传递类的实例,也不需要讲实例存放在全局变量中,就可以访问类的方法和属性。
2.类的每个实例都可以访问类中定义的静态属性,所以你可以利用静态属性来设置值,该值可以被雷的所有对象使用。
3.不需要实例对象就能访问静态属性和方法,这样我们就可以不用为了获取一个简单的功能而实例化对象。
< ?phpclass ShopProduct{ private $id = 0; public function setID($id){ $this->id = $id; } public static function getInstance($id, PDO $pdo){ //关键在这里,getinstance方法是一个静态方法,并且传入的是2个参数,一个是id一个是pdo的实例 $stmt = $pdo->prepare("select * from products where id=?"); $result = $stmt->execute(arrary($id)); $product = new BookProduct($result['title']); //这里特地设置了一个特定类型的shopproduct对象,这是一个book的shopproduct对象 $product->setID($result['id']); return $product; //这个方法没有使用任何实例的属性和方法,只要有一个有效的pdo对象,我们就可以在程序任何地方调用它,并且他返回的是一个特定类型的Shopproduct对象 }}$dsn = "sqlite://XXXXXX/products.db";$pdo = new PDO($dsn,null,null);$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMOTE_EXCEPTION);$obj = ShopProduct::getInstance(1, $pdo); //在这里,我们就直接调用了,而没有实例化对象。并且,pdo对象也是可以随时更换的,不用约束在某个pdo对象上。?>
这样的方法就像工厂一样,可以接受原始数据,然后根据这些数据产生对象。