当前位置: 首页 > news >正文

app网站开发小程序石家庄教育平台网站建设

app网站开发小程序,石家庄教育平台网站建设,彩票做网站犯法吗,wordpress 多语言插件哪个好基础知识1. 范围解析操作符 (::)可以用于访问静态成员#xff0c;类常量#xff0c;还可以用于覆盖类中的属性和方法。self#xff0c;parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。parent用于调用父类中被覆盖的属性或方法(出现在哪…基础知识1. 范围解析操作符 (::)可以用于访问静态成员类常量还可以用于覆盖类中的属性和方法。selfparent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。parent用于调用父类中被覆盖的属性或方法(出现在哪里就将解析为相应类的父类)。self用于调用本类中的方法或属性(出现在哪里就将解析为相应的类注意与$this区别$this指向当前实例化的对象)。当一个子类覆盖其父类中的方法时PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。2. PHP内核将类的继承实现放在了编译阶段class A{const H A;const J A;static function testSelf(){echo self::H; //在编译阶段就确定了 self解析为 A}}class B extends A{const H B;const J B;static function testParent(){echo parent::J; //在编译阶段就确定了 parent解析为A}/* 若重写testSelf则能输出“B”, 且C::testSelf()也是输出“B”static function testSelf(){echo self::H;}*/}class C extends B{const H C;const J C;}B::testParent();B::testSelf();echo \n;C::testParent();C::testSelf();运行结果AAAA结论self::和parent::出现在某个类X的定义中则将被解析为相应的类X除非在子类中覆盖父类的方法。3.Static(静态)关键字作用- 在函数体内的修饰变量的static关键字用于定义静态局部变量。- 用于修饰类成员函数和成员变量时用于声明静态成员。- (PHP5.3之后)在作用域解析符(::)前又表示静态延迟绑定的特殊类。例子定义静态局部变量(出现位置局部函数中)特征静态变量仅在局部函数域中存在但当程序执行离开此作用域时其值并不丢失。function test(){static $count 0;$count;echo $count;if ($count 10) {test();}$count--;}定义静态方法静态属性a)声明类属性或方法为静态就可以不实例化类而直接访问。b)静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)c)如果没有指定访问控制属性和方法默认为公有。d)由于静态方法不需要通过对象即可调用所以伪变量 $this 在静态方法中不可用。e)静态属性不可以由对象通过 - 操作符来访问。f)用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。g)就像其它所有的 PHP 静态变量一样静态属性只能被初始化为文字或常量不能使用表达式。所以可以把静态属性初始化为整数或数组但不能初始化为另一个变量或函数返回值也不能指向一个对象。a.静态方法例子(出现位置 类的方法定义)class Foo {public static function aStaticMethod() {// ...}}Foo::aStaticMethod();$classname Foo;$classname::aStaticMethod(); // 自PHP 5.3.0后可以通过变量引用类?b.静态属性例子(出现位置类的属性定义)class Foo{public static $my_static foo;public function staticValue() {return self::$my_static; //self 即 FOO类}}class Bar extends Foo{public function fooStatic() {return parent::$my_static; //parent 即 FOO类}}print Foo::$my_static . \n;$foo new Foo();print $foo-staticValue() . \n;print $foo-my_static . \n; // Undefined Property my_staticprint $foo::$my_static . \n;$classname Foo;print $classname::$my_static . \n; // As of PHP 5.3.0print Bar::$my_static . \n;$bar new Bar();print $bar-fooStatic() . \n;?c.用于后期静态绑定(出现位置 类的方法中用于修饰变量或方法)下面详细分析后期静态绑定(late static binding)自 PHP 5.3.0 起PHP 增加了一个叫做后期静态绑定的功能用于在继承范围内引用静态调用的类。1.转发调用与非转发调用转发调用 :指的是通过以下几种方式进行的静态调用self::parent::static:: 以及 forward_static_call()。非转发调用 明确指定类名的静态调用(例如Foo::foo())非静态调用(例如$foo-foo())2.后期静态绑定工作原理原理存储了在上一个“非转发调用”(non-forwarding call)中的类名。意思是当我们调用一个转发调用的静态调用时实际调用的类是上一个非转发调用的类。例子分析class A {public static function foo() {echo __CLASS__.\n;static::who();}public static function who() {echo __CLASS__.\n;}}class B extends A {public static function test() {echo A::foo()\n;A::foo();echo parent::foo()\n;parent::foo();echo self::foo()\n;self::foo();}public static function who() {echo __CLASS__.\n;}}class C extends B {public static function who() {echo __CLASS__.\n;}}C::test();/** C::test(); //非转发调用 进入test()调用后“上一次非转发调用”存储的类名为C** //当前的“上一次非转发调用”存储的类名为C* public static function test() {* A::foo(); //非转发调用 进入foo()调用后“上一次非转发调用”存储的类名为A然后实际执行代码A::foo(), 转 0-0* parent::foo(); //转发调用 进入foo()调用后“上一次非转发调用”存储的类名为C 此处的parent解析为A ,转1-0* self::foo(); //转发调用 进入foo()调用后“上一次非转发调用”存储的类名为C 此处self解析为B, 转2-0* }*** 0-0* //当前的“上一次非转发调用”存储的类名为A* public static function foo() {* static::who(); //转发调用 因为当前的“上一次非转发调用”存储的类名为A 故实际执行代码A::who(),即static代表A进入who()调用后“上一次非转发调用”存储的类名依然为A因此打印 “A”* }** 1-0* //当前的“上一次非转发调用”存储的类名为C* public static function foo() {* static::who(); //转发调用 因为当前的“上一次非转发调用”存储的类名为C 故实际执行代码C::who(),即static代表C进入who()调用后“上一次非转发调用”存储的类名依然为C因此打印 “C”* }** 2-0* //当前的“上一次非转发调用”存储的类名为C* public static function foo() {* static::who(); //转发调用 因为当前的“上一次非转发调用”存储的类名为C 故实际执行代码C::who(),即static代表C进入who()调用后“上一次非转发调用”存储的类名依然为C因此打印 “C”* }*/故最终结果为A::foo()AAparent::foo()ACself::foo()AC3.更多静态后期静态绑定的例子a)Self, Parent 和 Static的对比class Mango {function classname(){return __CLASS__;}function selfname(){return self::classname();}function staticname(){return static::classname();}}class Orange extends Mango {function parentname(){return parent::classname();}function classname(){return __CLASS__;}}class Apple extends Orange {function parentname(){return parent::classname();}function classname(){return __CLASS__;}}$apple new Apple();echo $apple-selfname() . \n;echo $apple-parentname() . \n;echo $apple-staticname();?运行结果MangoOrangeAppleb)使用forward_static_call()class Mango{const NAME Mango is;public static function fruit() {$args func_get_args();echo static::NAME, . join( , $args) . \n;}}class Orange extends Mango{const NAME Orange is;public static function fruit() {echo self::NAME, \n;forward_static_call(array(Mango, fruit), my, favorite, fruit);forward_static_call(fruit, my, father\s, favorite, fruit);}}Orange::fruit(NO);function fruit() {$args func_get_args();echo Apple is . join( , $args). \n;}?运行结果Orange isOrange is my favorite fruitApple is my fathers favorite fruitc)使用get_called_class()class Mango {static public function fruit() {echo get_called_class() . \n;}}class Orange extends Mango {//}Mango::fruit();Orange::fruit();?运行结果MangoOrange应用前面已经提到过了引入后期静态绑定的目的是用于在继承范围内引用静态调用的类。所以 可以用后期静态绑定的办法解决单例继承问题。先看一下使用self是一个什么样的情况// new self 得到的单例都为A。class A{protected static $_instance null;protected function __construct(){//disallow new instance}protected function __clone(){//disallow clone}static public function getInstance(){if (self::$_instance null) {self::$_instance new self();}return self::$_instance;}}class B extends A{protected static $_instance null;}class C extends A{protected static $_instance null;}$a A::getInstance();$b B::getInstance();$c C::getInstance();var_dump($a);var_dump($b);var_dump($c);运行结果E:\code\php_test\apply\self.php:37:class A#1 (0) {}E:\code\php_test\apply\self.php:38:class A#1 (0) {}E:\code\php_test\apply\self.php:39:class A#1 (0) {}通过上面的例子可以看到使用self实例化得到的都是类A的同一个对象再来看看使用static会得到什么样的结果// new static 得到的单例分别为DE和F。class D{protected static $_instance null;protected function __construct(){}protected function __clone(){//disallow clone}static public function getInstance(){if (static::$_instance null) {static::$_instance new static();}return static::$_instance;}}class E extends D{protected static $_instance null;}class F extends D{protected static $_instance null;}$d D::getInstance();$e E::getInstance();$f F::getInstance();var_dump($d);var_dump($e);var_dump($f);运行结果E:\code\php_test\apply\static.php:35:class D#1 (0) {}E:\code\php_test\apply\static.php:36:class E#2 (0) {}E:\code\php_test\apply\static.php:37:class F#3 (0) {}可以看到使用static可以解决self时出现的单例继承问题。
http://www.pierceye.com/news/8780/

相关文章:

  • 深圳网站设计制ui设计师创意平台
  • 和拓者设计吧类似的网站wordpress界面英文版
  • ps做网站广告logo有建设网站的软件吗
  • 聊城网站seo域名永久免费注册
  • 怎样推广一个网站电子商务网站建设的重要行
  • 图书翻页的动画 做网站启动用口味王网站建设可行分析表
  • 营销网站建站公司具有口碑的柳州网站建设价格
  • 大庆城市投资建设网站中小网站建设都有哪些方案
  • 常熟做网站多少钱按东莞网站设计
  • dnf怎么做提卡网站网站备案通过之后
  • 宝安网站建设定制网页微信能不能传文件
  • 章丘做网站公司百度搜图入口
  • 北京网站设计制作关键词西安市环评建设备案网站
  • 推广型网站建设销售wordpress固定链接去掉index.php
  • 广州网站建设 广州亦客网络百度排行榜前十名
  • 外包网站都有哪些牡丹区住房城乡建设局网站
  • 怎么免费做网站教程福建省住房和城乡建设厅门户网站
  • 一元购网站建设多少钱网页设计与制作论文2000字
  • 深圳市设计网站公司步骤的英文单词
  • 重庆网站建设入门培训网站建设金手指
  • 网页上做网会员网站备案怎么写女孩子做运营是不是压力很大
  • 网站源码采集网站做成小程序
  • 公司需要一个简单的网站网站前台模块包括什么
  • 前程无忧网站开发待遇怎么样山东建设银行官方网站
  • 外贸做哪些网站平台好你认为公司在建立网站时应满足哪些目标
  • 温州市网站制作公司张掖网站建设0936e
  • 建网站公司联系方式广告设计创意作品
  • 网站开发需要多少人可以个人开店的电商平台
  • 企业网站在ps里做吗nginx网站301重定向怎么做
  • 淮南电商网站建设价格上海市住房与城乡建设部网站