PHP:数据类型之间的转换与常量的声明和使用
PHP是弱类型的语言
PHP中共有8中类型
4种标量 //只能存储一个值)
1.整 型:int integer
2.布尔型:bool boolean
3.浮点型:float,double,real
4.字符型:string
2种复合类型 //一个变量能存储多个值
1.数组:array //只能存储多个变量
2.对象:object //可存变量以及函数
2中特殊类型
1.资源类型:resource
2.空 类 型:null
例子:Var_dump(变量或值); //即可以查看变量或值的类型,又可以看数据
代码:
<?php
//输出整数型
$var=10;
echo "<pre>"; //<pre>标签是以代码原形输出
var_dump($var);//输出结果:int(10),意思是为整数型,值为10
echo "</pre>";
echo "----------------------<br>";
//输出浮点型
$var=11.11;
echo "<pre>";
var_dump($var);//输出结果:float(11.11),意思是为浮点型,值为11.11
echo "</pre>";
echo "----------------------<br>";
//输出布尔型
$var=true;
echo "<pre>";
var_dump($var);//输出结果:bool(true),意思是为布尔型,值为true
echo "</pre>";
echo "----------------------<br>";
//输出字符型
$var="mk";
echo "<pre>";
var_dump($var);//输出结果:string(2) "mk",意思是为字符型,值为mk
echo "</pre>";
echo "----------------------<br>";
//输出数组
$var=array(1,2,3);
echo "<pre>";
var_dump($var);
echo "</pre>";
echo "----------------------<br>";
?>
数据类型的转换
一种是强制转换:
1.setType(变量,类型);//类型int,integer,float,double,real,bool,boolena,string,array,object
这个函数将原变量的类型改变,var_dump();
代码:
$str="100.1254abc";
setType($str,int);
var_dump($str);
2.在赋值前使用(类型)的形式,不会改变原变量的类型($a=(int)$str;)
代码:
$str="100.1254abc";
$a=(int)$str;
var_dump($a);
var_dump($str);
3.$变量=intval(变量或值);
$变量=float(变量或值);
$变量=stringval(变量或值);
代码:
$str="100.1254abc";
$a=intval($str);
var_dump($a);
注意:整型在内存中占4个字节
浮点型在内存中占8个字节
一种是自动转换(这是PHP最常用的方式,因为这种我们开发时不用去管理类型,变量会根据运行环境自动转换)
代码:
$a=10;
$b=true;
$c="100abc";
$d=12.14;
$sum=$a+$b+$c+$d;
var_dump($sum);
与变量和类型有关的一些常用函数
isset(); //是判断变量存不存在,值如果是null,也表示空
代码:
$a="";
if(isset($a)){
echo "存在";
}else{
echo "不存在";
}
empty(); //判断一个变量是否为空,如 "" null
代码:
$a="";
if(empty($a)){
echo "null";
}else{
echo "No null";
}
unset();
setType();
getType();
变量类型测试函数
is_bool();
is_int(); is_integer(); is_long();
is_string();
is_float(); is_double(); is_real();
is_array();
is_object();
is_resource();
is_null();
is_scalar();
is_numberic();
is_callable();
常量的声明与使用
1.常量是一个简单的标识符
2.常量定以后不能再改变他的值,也不能使用unset()取消
3.常量可以不用理会变量范围的规则而在任何地方都可以定义和访问
4.常量使用define("常量名",值)
5.常量名在声明和使用都不使用"$"
6.常量名称习惯使用大写
7.常量的值只能用标量类型(int,float,bool,string)
8.常量一定要在声明时就给值
9.defined("常量") //判断常量存不存在
代码:
define("MK","Morker");
echo MK;
defined();
代码:
define("MK2B","Morker");
if(defined("MK")){
echo MK;
}else{
define("MK",504815135);
}
echo MK;
在PHP一段语言中
<?php
phpinfo();
?>
例1
<?php
phpinfo()
?> //在php语言中,在语言最后结束时phpinfo()可以不加“;”,后面的?>这个可以直接作为结束,以及默认可以作为正确解释。
例2
<?php
phpinfo();
//在phpinfo();为最后语句时,可以不用加?>,也可以正确解析,这个在以后作为调用时,可以避免出错,所以推荐在语句结束时,可以不用“?>”
思路:既然星际的画面由几个部分组成:地图(就是地形和矿产),建筑,部队。那么我们把他们看成是零件,组装起来就是最后的产品(整个画面)。
建造器(Builder)模式示例:
代码如下 | 复制代码 |
<?php //规范制造各个零件的接口 interface Builder { //制造地图零件 public function buildMapPart(); //制造建筑零件 public function buildBuildingPart(); //制造部队零件 public function buildArmyPart(); //组装零件 public function getResult(); } //实际建造器类,比如初始化某个任务关 class ConcreteBuilder implements Builder { //制造地图零件 public function buildMapPart() { //根据任务的设定画上地图 echo '地图零件n'; } //制造建筑零件 public function buildBuildingPart() { //根据任务的设定画上建筑,包括玩家的和敌人的 echo '建筑零件n'; } //制造部队零件 public function buildArmyPart() { //根据任务的设定画上部队,包括玩家的和敌人的 echo '部队零件n'; } //组装零件 public function getResult() { //将所有的东西叠加和处理,形成初始化画面 echo '组装零件n'; } } //监督类,也就是控制绘制流程的类 class Director { //私有属性,确定使用的建造器 private $builder; //构造方法,参数为选定的建造器对象 public function __construct($builder) { //确定使用的建造器 $this->builder = $builder; } //负责建造流程的方法,调用建造器对象的方法,制造所有零件 public function buildeAllPart() { //制造地图零件 $this->builder->buildMapPart(); //制造建筑零件 $this->builder->buildBuildingPart(); //制造部队零件 $this->builder->buildArmyPart(); } } //假设根据任务关,初始化我们需要的实际建造器对象 $concreteBuilder = new ConcreteBuilder(); //初始化一个监督对象 $director = new Director($concreteBuilder); //制造所有零件 $director->buildeAllPart(); //最后让建造器组装零件,生成画面 $concreteBuilder->getResult(); ?> |
用途总结:建造器模式可以将流程和细节分离,各司其职。
实现总结:需要一个建造器接口或者抽象类,负责规范各个方法,比如上面的Builder。然后让实际的建造器类去实现所有的方法,比如上面的ConcreteBuilder。同时需要负责流程管理的监督类,比如上面的Director,负责调用建造器的各个零件制造方法。最后让建造器去组装所有的零件
代码如下 | 复制代码 |
<?php $method = $object->getMethod('load_app_class'); |
在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。 当然,PHP5之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 在PHP5后,当加载PHP类时,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调用__autoload 函数。此函数需要用户自己实现__autoload函数。 在PHP5.1.2版本后,可以使用spl_autoload_register函数自定义自动加载处理函数。当没有调用此函数,默认情况下会使用SPL自定义的spl_autoload函数。 看下面两个例子:
1、 __autoload示例:
代码如下 | 复制代码 |
function __autoload($class_name) { |
以上的代码在最后会输出:__autload class:Demo。
并在此之后报错显示: Fatal error: Class 'Demo' not found
2、spl_autoload_register示例:
代码如下 | 复制代码 |
function classLoader($class_name) { |
以上的代码在最后会输出:SPL load class:Demo。
并在此之后报错显示: Fatal error: Class 'Demo' not found
以上的两个示例表明:当类不存在时(即需要的类不在类符号表),Zend引擎会将再调用一次用户定义的函数,如__autoload或spl_autoload_register注册的函数。 如果这两个方法同时存在,那么程序会调用哪一个呢?还是说两个都调用?看下面一个示例,你觉得会输出什么呢?
代码如下 | 复制代码 |
function __autoload($class_name) { |
__set、__tostring等类的魔法方法的常量定义在源码级别是一起的, 可是它并不是专属于某个类的魔法方法。它是所有的类共用的自动加载魔术方法。 它将作为一个全局函数存在。那么Zend引擎是如何在类没有找到时调用这个方法的呢?
不管是使用new关键字创建类的实例,还是使用implement实现接口,或者继承某个类, 所有的这些操作都有可能调用__autoload函数。这几个操作在源码层都有一个共同点,它们在执行的时候都需要获取类的信息(接口在本质上也是一个类)。 它们在最终都会调用 zend_fetch_class (Zend/zend_execute_API.c)函数,这个函数本身没有多少内容,关键是它调用了zend_lookup_class_ex(Zend/zend_execute_API.c)函数, 这个函数就是类的自动加载的真相所在。
在zend_lookup_class_ex函数中,我们看到程序会首先查询类符号表,如果存在类直接返回。如果不存在,就会执行我们所说的自动加载了。这里针对__autoload函数和spl相关的函数都做了处理,并且以第一参数和第二参数传递给Zend引擎的函数调用函数zend_call_function。
在zend_call_function函数中,它会判断第二参数是否存在函数,如果存在函数则只会调用第二个参数传递的函数(这里指SPL注册的函数)。如果第二个函数没有值,则执行第一个参数传递过来的函数(这里指用户定义的__autoload函数)。到这里,我想前面提到的两个方法同时存在的情况应该就有答案了,这也算是一篇基于的php教程了。
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
php中浮点型(float)和整型(integer)数据类型详解
文章分析了关于php中浮点型(float)和整型(integer)数据类型的用法区别以及在那种情况下会出现数据长度不够。 取值只能为True或者False,当其他类型转化为boolean类...2016-11-25- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 本篇文章主要是对c#中数据类型占用的字节数进行了详细的介绍。需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
- 本文主要对C# 类的声明进行详细介绍。具有一定的参考价值,下面跟着小编一起来看下吧...2020-06-25
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 虽然Javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:Number、String、Boolean、Object、Udefined、Null。其中,Object属于复杂数据类型,Object 由无序的键值对组成。其余几种都属于简单数据类型。注意:变量...2015-10-21
- 前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08