php有点

面试集锦:盘点PHP魔术方法的使用(一)

很多公司在招聘PHPers应届毕业生时,通常会考查一些PHP基础的知识。博主曾在几份笔试题中做到与PHP魔术方法相关的考题。今天就写个帖子,供PHPers菜鸟们参考讨论。

PHP的魔术方法主要有:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__tostring()、__invoke()、__set_state()、__clone()。需要注意,每个方法名前的“__”是两条英文状态下的下划线,依次讲一下这些方法的使用。

1.__construct()、__destruct():这两个是最常见的魔术方法,在《PHP基础学习注意点(一)》一文中对这两个方法已经有所介绍,需要补充的是,子类在默认的状况下是不会调用从父类继承的构造函数的,需要用parent::__construct()显式地调用。

2.__call(string $name , array $arguments):该方法的返回值可以为任意类型,$name参数是要调用的方法名称,且区分大小写,$arguments参数是一个数组,包含着要传递给方法的参数。当调用一个不可访问方法(如未定义或不可见)时,该方法会自动被调用,实例代码如下:

class MethodTest{public function __call($name, $arguments){// 注意: $name 的值区分大小写echo $arguments[0] .",you are calling object method '$name' ". $arguments[1].\";}}$obj = new MethodTest;$obj->runTest(‘Haha’,'in object context');//自动调用__call()方法,输出结果

分析:在上述代码中,类中并没有定义runTest()方法,但是由于定义了__call()魔术方法,此时方法名runTest会自动传给形参$name,而runTest()的实参将以数组的形式自动传给形参$arguments。

3.__callStatic(string $name , array $arguments):__callStatic()魔术方法的使用与__call()相似,唯一需要主要的是此方法只在PHP 5.3.0以后的版本支持启用,当调用未定义的静态方法时,此魔术方法会被自动调用。模式如下:

class MethodTest{public static function __callStatic($name, $arguments){// 注意: $name 的值区分大小写echo $arguments[0] .",you are calling object method '$name' ". $arguments[1].\";}}MethodTest::runTest(‘Haha’,'in static context');//自动调用__callStatic()方法,输出结果

关于如何调用一个静态方法,亦可以参考《PHP基础学习注意点(一)》一文。

4.__get()、__set():这通常是成对出现的魔术方法,在给未定义的变量赋值时,__set()会自动被调用,读取未定义的变量时,__get()会自动被调用。模拟使用该魔术方法的实例如下:

data[$name] = $value;}public function __get($name){echo "Getting value from method of set:$name=".$this->data[$name].\";return $this->data[$name];}}$obj = new PropertyTest();$obj->a = 1;echo $obj->a;?>

分析:注意到成员属性a并没有在类中定义,执行$obj->a=1语句时,此时会自动调用__set($name,$value)方法,并且a将传递给形参$name,1将传递给形参$value;当执行echo $obj->a时,程序会自动调用__get($name)方法,需要注意的是,此时__get()的参数并不要求与__set()的第一个参数相同。

5.__clone():这个魔术方法非常好理解,当对象被克隆的时候,即自动调用该方法。演示实例如下:

class MyCloneable{public function __clone(){ echo "当前对象被克隆了哦";}}$obj = new MyCloneable();$obj1 = clone $obj; //克隆刚才创建的对象$obj

分析:当执行$obj1 = clone $obj;语句时,自动调用__clone()方法,输出结果:当前对象被克隆了哦

后续阅读《面试集锦:盘点PHP魔术方法的使用(二)》

展开
收起

盘点php的gui图形界面开发扩展库

对于图形界面开发,太多语言有着自己的实现,不过大部分语言采用的都是绑定实现的,因为大部分图形库都是基于c/c++开发的,而众多语言都提供了和c交互的接口,所以我们就可以通过这些接口来实现一个语言的图形界面开发。

我们都知道php的底层是c语言实现的,并且它的扩展也是使用c语言来开发的,而且它的大部分功能都是通过扩展来实现的,因此,它也是可以通过扩展库来实现图形界面开发的,今天,我们就来盘点php开发图形界面的扩展库。

php-gtk2

gtk是一个免费开源的图形库,它有着丰富的api,有着出色组件接口,同时它是跨平台的,而php-gtk2就是php语言和gtk的绑定,通过安装php-gtk扩展,我们就可以使用php语言来编写图形界面。

php-ui

php7出现的时候,php官方推出了自己的图形UI库,其实它是基于libui绑定的扩展库。

libui也是c语言开发的,非常简单灵巧的图形库,它在各个操作系统下都有着出色的表现。

libui也是有着最多语言绑定的图形库,我们熟知的大部分语言都提供了和libui绑定的扩展库,从这点来看,足矣说明它的受欢迎度。

lazarus-php

这是一个基于lazarus的php库,它的强大之处在于你不需要安装任何其它的php扩展,只需要使用composer引入依赖,你就可以开发出一个图形界面程序。如果你没有接触过php图形界面开发,使用它可能是你最快上手php图形界面开发的方案。

php-sdl2

sdl是一款非常出色图形库,现在它的最新版本是2.2,通过使用它,我们可以轻松访问音频,访问鼠标,接入OpenGL图形库,接入Direct3D来访问显卡。

总结

相比较其它语言,php的图形扩展库确实少得可怜,不过这并不是说php就不能用来开发图形界面。在开发一些不需要高性能的图形界面的时候,任何语言都是可以做的,而我们需要的做的仅仅是找到最适合自己的那个语言,然后把它开发出来。

展开
收起

PHP底层分析之编译特点

PHP给人的第一感觉它是一种脚本语言,同时它又可以跨平台,它是咋样完成跨平台的?作为脚本语言的PHP对其描述是否够精确?我们接下来了解一下。代码的大致执行过程如下图所示:

PHP代码执行图解

PHP的大致执行过程是这样的。PHP代码是不能直接运行的,首先需要经过词法分析器分析、语法分析,在经过编译器编译成opcode 中间件,可能看到这里有的人会奇怪,PHP还能编译呀?其实严格来说,PHP是一种编译语言。编译成了opcode ,一个中间码。类似JAVA中的class文件。在由zend 执行引擎上执行它的opcode ,从这点上来说,它是一个先编译后执行的语言。

PHP底层分析之编译特点

对于编译型语言如C语言,C++等,都是先编译成机器码(二进制)来运行的。JAVA语言,是把JAVA编译成class ,称为bytecode 的字节码,在由JVM来运行的。JVM相当于在操作系统弄个层面又架了一层软件模拟的机器。为什么JAVA跨平台?其实JAVA本身是不跨平台的,真正跨平台的是JVM,而JAVA运行在JVM上,所以我们通常认为JAVA可以跨平台。

PHP执行流程架构图

对于解释语言,是由解释器来解释执行的,典型的如linux shell,解释器逐行来执行命令。

PHP稍微有些特殊之处。虽然是一个脚本语言,但不是靠解释器解释的。而是zend 虚拟机屏蔽了操作系统的区别来实现跨平台执行的。PHP代码编译成opcode,由zend 虚拟机来执行opcode。

对于JAVA语言而言,通过编译后的二进制文件,可以直接打包发布。但是PHP就不行了。PHP的opcode在PHP脚本一结束,就清除了。下次执行重新生成opcode。那么鉴于这种情况,opcode 能否作为缓存来用呢?Php 本身不支持,但是apc、xcache 等第三方工具 加速器实现了对opcode 的重复利用。

以上就是PHP大致的一个编译过程。

展开
收起

php晋级必备:一文读懂php接口特点和使用!

PHP接口与类是什么关系?

前面提到了php中抽象类和抽象方法,今天给大家谈谈php中接口技术。在PHP中每个类只能继承一个父类,如果声明的新类继承了抽象类实现了以后,这个新类就不能有其它的父类了。但是在实际中需要继承多个类实现功能,为了解决不能继承多个类的问题php引入了接口概念。PHP接口与类是什么关系?PHP接口是一种特殊的抽象类,而抽象类又是一种特殊的类,所以PHP接口也是一种特殊类的。抽象类和PHP接口都不能实例化对象,需要通过子类实现。

接口的特点

在PHP接口中所有声明的方法都必须是抽象方法,方法不需要用abstract关键字,因为方法默认是公共权限,也不需要用pubilc表示。不能在接口中声明变量,可以使用const关键字声明常量属性,PHP接口中所有成员必须有public的访问权限。类声明用“class”关键字,而接口的声明是使用“interface”关键字,可以使用extends关键字让接口去继承接口,实现接口之前扩展。声明格式如下:

接口中内全部抽象方法,需要子类的对象去调用在子类中实现方法。类去继承接口时需要使用“implement”关键字来实现,不是使用extends关键字完成。抽象类去实现接口中的部分方法,也需要使用implement关键字实现。声明一个接口A,抽象类B使用implements继承了接口A,抽象类B中声明接口A中的抽象方法a,声明一个类C中继承了接口A中的抽象方法a和抽象方法b。代码如下:

php接口使用注意事项

PHP是单继承的,一个类只能有一个父类,但是接口可以实现多个接口。将要实现的多个接口之前使用逗号分隔开,而且子类要将所有的接口中的抽象方法全部实现才能创建对象,否则会出错。接口相当于一个规范,打个比方接口像是国家法律,而抽象类就像是单位的规章制度,在单位要遵守的单位制度同时也要遵守国家的法律。实现继承多个接口语法是class 类名 接口1,接口2,接口3,....接口n{}。最后在提醒大家一次子类一定要实现接口中所有的抽象方法,否则会报错!

每天分享一个知识点,每日寄语:Perseverance until success !(坚持不懈直到成功)

展开
收起

盘点7款顶级 PHP Web 框架

2019年,PHP 代表超文本预处理器(Hypertext Pre-processor)是非常流行的 Web 服务端编程语言,快快小编今天就来和大家一起盘点7款顶级的 PHP 框架。

1、Laravel

Laravel 是一个免费的开源 PHP 框架,在Web开发人员中非常受欢迎。它适用于移动应用程序场景。Laravel 提供了几个特定的软件包,使 Web 开发成为一项功能强大的任务。例如:单元测试;轻量级 Blade 模板引擎;对象关系映射 ;包系统;RESTful 控制器。

Laravel的优势:易于学习;无缝数据迁移;MVC 架构支持;大量培训材料教程;模板引擎;简单的单元测试等。

2、Yii2

Yii2是一个基于组件的高性能 PHP 框架,基本能提供PHP 框架中的所有特性,安全功能优秀,并且具有极好的可扩展性,当程序员需要确保可扩展性并开发高效、易于维护的 Web 应用程序时,选这个功能强大且易于使用的框架准没错。

Yii2 的优势:简单的第三方组件集成;AJAX 支持;处理错误的有效工具;自定义默认设置;强大的社区支持等。

3、Zend

Zend 框架是一个完整的、可定制的、面向对象的 PHP 框架。Zend 构建于敏捷方法之上,可帮助开发人员为大型客户创建、高质量的 Web 应用程序的框架。它非常适合复杂的企业级项目。

Zend的优势:实时在线调试;PHP 单元测试工具;连接数据库向导;加密编码工具;具有前端技术支持的拖放编辑器;MVC 组件;卓越的前端技术支持工具;简单的云 API;支持第三方组件;数据加密等。

4、CodeIgniter

CodeIgniter 适合开发动态网站,它是一个非常简单的轻量级 PHP 框架,大小只有 2 MB 左右。CodeIgniter 还提供了几个预构建的模块,可以用来为 Web 开发创建健壮的、可重用的组件,设置过程简单,适合初学者使用。

CodeIgniter 的优势:MVC 架构;Top-Notch 错误处理;提供卓越的性能;包中提供了几种工具;内置安全工具;优秀的文档等。

5、CakePHP

CakePHP 框架对个人完全免费,并提供付费的商业用途。使用 CakePHP 部署 Web 网站非常容易,只需要一个 Web 服务器和 CakePHP 框架的副本。

此外,CakePHP还有其他优势:插件和组件的简易扩展;适当的类继承;零配置;现代框架;支持 AJAX;快速构建;内置验证等。

6、Phalcon

Phalcon 是用 C 和 C ++ 编写的,但并不是学习 C 语言才能使用。Phalcon 非常易于安装,非常适合创建高度可定制的 Web 解决方案。

PHP Phalcon 框架创建符合企业开发指南的网站和 Web 应用程序。与其他框架相比,Phalcon使用的资源非常少,从而可以快速处理 HTTP 请求。

Phalcon PHP的优势:执行速度;低开销;资产管理 (Asset Management);独特的 C 语言扩展;通用自动装载机;开发人员的友好框架;顶级安全和缓存;构建性能 REST API 的理想选择。

7、Symfony

Symfony 稳定、文档齐全、性能卓越,是一个被广泛使用的 PHP MVC 框架。它的可重用 PHP 组件非常特别,能使开发时间减少了许多模块,如表单创建、对象配置、模板等。可以直接从旧组件构建,节约了大量成本。

Symfony的优势:丰富的框架内置功能;官方长期技术支持;内置测试功能;官方培训课程和认证等。

展开
收起

盘点PHP最实用的5大魔术方法及其功能作用

PHP是一门非常优秀的脚本编程语言,与其它编程语言有一个非常不同的地方,那就是魔术方法,PHP有非常多的魔术方法用于实现一些非常不可思议的功能。

啥是PHP的魔术方法?

在定义类时,以两个下划线字符(__)开头的方法都是魔术方法,而且方法名都是PHP预先定义好的,每一个都拥有魔术般的功能。我们自己在定义方法时,不建议使用两个下划线字符开头,这样会与PHP的魔术方法混淆。

PHP有哪些魔术方法?

PHP提供了非常多的魔术方法,比如: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 等等,今天我来给大家说说其中非常实用的5个。

第1:__construct()构造方法

执行时机:在使用 new关键字使用类实例化一个对象时自动执行

功能作用:通常用于对对象的属性进行初始化

用法示例:

如何记住:construct 含义:构成;修建;建造; 读音: [knstrkt] ,可以理解为构造对象的方法,在构造对象时自动执行。

第2:__destruct()析构方法

执行时机:在对象被销毁(unset或PHP执行结束)时自动执行

功能作用:通常用于释放对象占用的第三方资源(如:数据库)

用法示例:

如何记住:destruct 含义:破坏;破坏的; 读音: [d'strkt]

第3:__toString()转换字符串

执行时机:在对象被当成字符串使用时自动执行

功能作用:兼容对象的字符串调用形式,根据用户需求显示出对象的字符串形态

用法示例:

如何记住:toString 含义:to到;向,朝着; String 字符串; 读音: [tu,t] [str]

第4:__invoke()函数调用方法

执行时机:在对象被当成函数使用时自动执行

功能作用:兼容对象的函数调用形式,允许用户像使用函数一样使用对象

用法示例:

如何记住:invoke 含义:援引;乞灵;祈求; 读音: [nvok]

第5:__clone()克隆方法

执行时机:在克隆(clone)对象时自动执行

功能作用:在克隆对象时可以同时执行一些其它操作,甚至可以阻止对象被克隆

用法示例:

如何记住:clone 含义:复制;克隆; 读音: [klon]

总述,PHP提供了很多这样的魔术方法,他们都有神奇的功能,在做相应的操作时都会自动执行,由于时间关系我们本次就只能盘点PHP这5大魔术方法及其功能作用,如果对本次总结的魔术方法或其它的PHP魔术方法有疑惑也可以随时来源码时代一起讨论交流哦。

展开
收起

php中字符串数据类型有什么特点?它有哪些定义方法?

php中字符串数据类型有什么特点?

字符串是php编程语言中八种数据类型一种,也是编程中常用的一种数据类型,首先要明白字符和字节是一样的,一个字符串可以是一个字符,在实际编程的过程中一个字符串可以变的非常巨大,而这个字符串可以由多个字符组成,php中字符串的长度没有限定,一篇论文、一首诗、一首歌都可以定义成字符串,那么在php中用什么方法定义字符串?下面为大家介绍一下:

php字符串数据类型

php字符串可以使用单引号、双引号、定界符三种方法定义字符串但他们使用功能上有很大的区别:

1、单引号定义字符串方法

用一个单引号(‘’)把字符串包含在内就行,单引号包括的内容不能再出现单引号,如果有单引号出现就会出现错误。如果必须要出现单引号需要用转义符号(反斜杠),如果字符串内容中出现反斜杠需要加两个反斜杠进行转义,另外单引号字符串中出现变量不会被变量值替代。

php字符串运行

2、双引号定义字符串方法

用一个当引号(“”)把字符串包含在内就行,双引号字符串出现变量会被变量值代替,会自动解析双引号出现的变量,这一点是和单引号字符串最大的区别,如果不想双引号中变量执行的话可以用花括号把变量名括起来。

双引号定义字符串

3、定界符定义字符串方法

使用定界符(“<<<”)在<<<之后提供标识符开始,然后在字符串内容,最后是标识符结束,标识符结束必须行的第一列开始(可以理解必须在文档最左边顶头)后来除了分号不能再有其他的字符,(空格也不行)。定界符定义字符串方法通常用于大段的数据输出。

定界符定义字符串

以上内容是关于字符串三种定义方法简单介绍,大家有什么好的想法欢迎补充讨论。

展开
收起

怎么理解编程中的变量?php中变量有哪些特点?

任何一门编程语言的语法都会涉及到变量,而每位程序员也都会和它打交道,变量准确的定义是“是计算机语言中能储存计算结果或能表示值抽象概念”,想要更好理解变量需要先弄清内存和变量的关系。

内存:内存是暂时存储程序以及数据的地方,所有程序都是在内存中运行的。

变量:变量代表了一段可操作的内存,也可以认为变量是内存的符号化表示。

Php中变量与内存的关系

下面为大家介绍“php中变量有哪些特点?”

 1、直接赋值

PHP是弱类型语言,其变量声明和使用比较方便。Php变量它不仅仅包含变量的值,也包含变量的类型。

php程序

输出结果

输出结果

 2、php变量使用注意事项

变量以 $ 符号开头,其后是变量的名称

变量名称必须以字母或下划线开头

变量名称不能以数字开头

变量名称只能包含字母数字字符和下划线

变量名称对大小写敏感

php变量作用域

3、php变量作用域

三种不同的变量作用域:

local(局部变量:函数内使用)

global(全局变量:函数内外使用)

static(静态)

局部变量和全部变量的划分标准是以函数为标准。

php变量类型

4、php变量类型

包括.普通变量($a = "php")、可变变量(使用两个美元符号“$”)、静态变量(static仅在函数内部)、全局变量(自定义 $GLOBALS 数组)

以上是常见的php变量类型大家一定要熟练掌握。

展开
收起

PHP基础学习注意点(一)

基础知识的扎实是进阶高层知识领域的底层建筑,无论学习哪门语言都是这个道理,小细节决定一切,PHP的学习也不例外。下面总结一些PHP基础学习中经常误解、曲解、易混淆的知识点(没有按照PHP进阶学习的顺序)。

1.PHP基础类型中的浮点型转化为整型的特例

echo intval((0.1+0.7)*10);有PHP基础的人可能都会认为上述语句的输出结果是8,但是事实上正确结果是7,这是因为0.1+0.7的结果表示其实是类似 7.9,PHP浮点数向其他数据类型转化时丢失精度是正常的事情。所以,亲们,注意咯

2.函数传递各种数据类型

PHP函数在传递各种数据类型时有默认的传递方式,比如,函数传递对象是默认传递的是对象的地址,而传递数组及其他基本数据类型时默认传递的是值。

3.条件判断语句的一个特例

if(0=='a'){echo "0=='a'为真";}else{echo "0=='a'为假";}粗心的人会认为输出结果是0==‘a’为假,但是正确结果是输出0==‘a’。这是因为‘a’与整型数据比较的时候会先转化为整型再进行比较,而intval('a')=0。

4.构造方法(__construct(),每个类都有默认的构造方法)没有返回值,构造方法的默认访问修饰符是public。

5.析构方法(__destruct()没有返回值,不接受参数,类没有默认的析构方法。)会自动调用,主要用于销毁资源,调用顺序是先创建的对象后被销毁(栈的先进后出原则)。在下列情况下析构方法会被调用:

当程序(进程结束)退出时当一个对象被视为垃圾对象时,所谓垃圾对象是指没有任何变量再引用它,一旦一个对象被视为垃圾对象,析构方法会立即被调用,如下列代码:$object1=new OB();$object1=null;$object2=new OB();$object3=new OB();上述代码中调用三个对象的顺序是先调用$object1的析构方法,然后调用$object3的析构方法,最后调用$object2的析构方法。注意下列代码的析构方法调用顺序:$object1=new OB();$object4=$object1;$object1=null;$object2=new OB();$object3=new OB();上述代码对象的析构方法调用顺序是先调用$object3的析构方法,然后调用$object2的析构方法,最后电泳$object1的析构方法。因为尽管$object1=null,但是有语句$object4=$object1,这意味着析构方法调用顺序将按照栈的后进先出原则。6.(1)静态(static)变量的访问方法

在类内:self::$类静态变量名 或 类名::$类静态变量名在类外:类名::$类静态变量名 (2)静态方法(不能访问非静态属性)的访问方法

在类内:self::静态类方法名 或 类名::静态类方法名在类外:类名::静态类方法名 或 对象名::静态类方法名(注意:如果该静态方法的访问修饰符不是public,则在类外不能使用 对象名::静态类方法名 访问静态方法) 注:静态方法只能访问静态属性/静态方法,不能访问非静态属性/非静态方法;静态属性可以被任何方法访问

7.常量(const)的访问方法

const关键字前不能有任何修饰符,包括不能有public在类内:self::常量名 或 类名::常量名在类外:类名::常量名 或 接口名::常量名8.使用抽象类:

一个类如果含有抽象方法,就必须声明为抽象类抽象类不能实例化,访问抽象类的已实现的public静态方法时在类外使用类名::静态方法名是可以的抽象类可以没有抽象方法,抽象类可以含有已实现的具体方法抽象方法必须放在抽象类中抽象方法不能有函数体如果一个类继承了某个抽象类(顺便提出,php是单继承的),则它必须实现该抽象类的所有抽象方法(除非它自己也声明为抽象类)9.使用接口(达到高内聚低耦合):

接口中的方法都不能有方法体(即在接口内不能含有已实现的 方法)接口中可以有属性,但必须是常量,而且是public的。在类外使用接口名::常量名访问常量当一个类实现了某个接口,则该类必须实现这个接口的所有方法,但是并不一定要求在类中使用接口中的常量接口不能实例化一个类可以实现多个接口接口中的方法默认是public的而且必须是public,不能是protected或是private一个接口不能继承其他的类,但是能多继承其他的接口10.final

final类不能被继承父类的final方法不能被子类修改final关键字不能修饰属性

展开
收起

php常量有哪些特点怎么使用?php预定义常量有哪些?

php常量有哪些特点?

常量是一个简单的标识符,可以简单理解为“不变的量”在程序运行时不会被修改(其实这个概念是不准确的)。在程序运行过程中常量一旦被定义不能修改或者取消定义,它的作用域是全局的,常量可以再脚本任何地方访问它。常量和变量都是php中的存储单元,其实在实际运行中,常量的值和地址值是会发生变化的,所以常量不能严格理解为‘运行过程中不变的量’描述,今天主要讨论不是常量的概念,这一点了解即可,不必太过于纠结。

常量的定义和使用

在php中常量和变量的声明方式不一样,常量是用define()函数函数来定义常量,常量的命名和变量相似,要遵循php的命名标准,常量和变量命名最大不同是

常量默认对大小写敏感(区分大小写)但是一般常量书写都是大写的字母,不要在常量前加上“$”符号,这是与变量明显的区别。define()命名格式如下:

define()函数使用注意事项:

1、设定后常量值无法更改

2、常量名不要开头的美元符号“$”

3、作用域不影响常量访问.

4、常量值只能是字符串或数字.

php预定义常量

在php中,除了我们自己可以定义常量外,系统为我们提供了强大的一系列系统常量供我们使用,我们可以利用系统预定义常量完成一些特殊功能,这些系统预定义常量需要不同的扩展库定义的,系统只有加载了这些扩展库才会出现。预定义变量的开头决定了不同的类型,有些常量会根据他们使用位置而发生改变,需要需要的是系统预定义常量通常是不区分大小写。常见的预定义变量如图:

关于php中变量今天先给大家聊到这,大家有什么好的想法咱们可以一块讨论下!

展开
收起