PHP 基础
PHP 基础 //实现中文字串截取无乱码的方法 // header("Content-Type:text/html;charset=utf-8"); // function substr_utf8($str,$start,$lenght=null){ // return join("",array_slice(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY),$start,$lenght)); // } // $str="传智博客php学院"; // echo substr_utf8($str,2,4); //如何求解字符串”中国2北333京”的字符数(一个中文一个字符),并找到第四个字符”北” // // header("Content-Type:text/html;charset=utf-8"); // $a="中国2北京333京"; // echo mb_strlen($a,'utf8'); // echo mb_substr($a,3,1,'utf8'); // // 简述POST和GET传输的最大容量分别是多少?(51.com笔试题) // POST根据你php.ini文件配置(默认是8M) // GET的话大小限制在2KB // // 表单中get与post提交方法的区别? // get是发送请求HTTP协议通过url参数传递进行接收, // 而post是实体数据,可以通过表单提交大量信息 // //echo(),print(),print_r()的区别?(新浪) //echo是一个语言结构,输出一个或多个字符串; //print()实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号来括起它的参数列表,输出一个字符串 //print_r()打印变量的信息,基本类型,数组,对象。 // //打印前一天的时间格式"Y-m-d H:i:s" //echo date("Y-m-d H:i:s",time()-3600*24); // $str = 'This is an encoded string'; // $str= base64_encode($str); // echo base64_decode($str); //请说明php中传值与传引用的区别。什么时候传值什么时候传引用 //变量默认总是传值赋值。那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。 PHP也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,“成为其别名”或者“指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。 对象默认是传引用。 对于较大的数据,传引用比较好。注意可以节省内存的开销。 //将1234567890转换成1,234,567,890每3位用逗号隔开的形式。 // $s = '1234567890'; // $count = 4; // echo $s; // echo '<br>'; // echo test($s,$count); // function test($s='',$count=3){ // if(empty($s) || $count <= 0){ // return false; // } // //反转 // $str = strrev($s); // //分割 // $arr = str_split($str,$count); // //连接 // $new_s = join(',',$arr); // //再次反转 // var_dump($new_s); // var_dump(strrev($new_s)); // } //逆转函数 // function strrev_utf8($str){ // return join("",array_reverse(preg_split("//u",$str))); // } // $str="1234567890"; // echo strrev_utf8($str); // // //用PHP写出显示客户端IP与服务器IP的代码 // echo $_SERVER['REMOTE_ADDR']; // echo $_SERVER['SERVER_ADDR']; //简述如何得到当前执行脚本路径,包括所得到参数 //获取当前执行脚本路径使用$_SERVER[‘SCRIPT_FILENAME'’]或basename(__FILE__) //获取参数,使用$_SERVER[‘QUERY_STRING'’] //sort()、assort()、和 ksort() 有什么分别?它们分别在什么情况下使用? // sort() // 根据阵列中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当阵列索引键的值无关疼痒时用来把阵列排序。 // assort() // PHP 没有 assort() 函式,所以可能是 asort() 的笔误。 // asort() // 与 sort() 一样把阵列的元素按英文字母顺序来排列,不同的是所有索引键都获得保留,特别适合替联想阵列排序。 // ksort() // 根据阵列中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的联想阵列。 // //检测一个变量是否有设置的函数是否?是否为空的函数是 //isset检测一个变量是否设置empty检测是否为空注意二者的区别,如果变量是非空或非零的值,则 //empty()返回FALSE。换句话说""、0、"0"、NULL、FALSE、array()以及没有任何属性的对象都将被认为是空的。 // //在PHP中error_reporting这个函数有什么作用? //打开或者关闭错误报告, //如:error_reporting(0); //error_reporting(E_ALL&~E_NOTICE); //error_reporting(E_ALL); //echo count("abc");输出什么? //输出1 count:计算数组中的单元数目或对象中的属性个数,通常是一个array,任何其它类型都只有一个单元。 //对于对象,如果安装了SPL,可以通过实现Countable接口来调用count()。该接口只有一个方法count(),此方法返回count()函数的返回值。 如果var不是数组类型或者实现了Countable接口的对象,将返回1,有一个例外,如果var是NULL则结果是0。 //写个函数用来对二维数组排序 // function array_sort($arr,$row,$type="asc"){ // $arr_temp=array(); // foreach ($arr as $v) { // $arr_temp[$v[$row]]=$v; // } // if($type="asc"){ // ksort($arr_temp); // } // else if($type="desc"){ // krsort($arr_temp); // } // return $arr_temp; // } // $person=array( // array('id'=>1,'name'=>'zhangsan','age'=>23), // array('id'=>3,'name'=>'zhang','age'=>25), // array('id'=>5,'name'=>'zaas','age'=>36) // ); // $person=array_sort($person,'name'); // print_r($person); //请写一个函数,实现以下功能:字符串“open_door”转换成“OpenDoor”、”make_by_id”转换成”MakeById” // function getString($eString) // { // $eString = explode('_',$eString); // $eString = array_map("ucfirst",$eString); // $eString = implode($eString,'_'); // return $eString; // } // echo getString("make_by_id"); // //计算某段字符串中某个字符出现的次数(例如:gdfgfdgd59gmkblg中g的次数) //$text='gdfgfdgd59gmkblg'; //echosubstr_count($text,'g');
php面试对象
<?php //PHP 面向对象 //设计模式考察:请用单态设计模式方法设计类满足如下需求 //请用PHP5 //代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码(新浪网技术部) // // class Mysql{ // static public $_instance; // public function __consruct(){ // //连接数据库 // } // public function getInstance(){ // if(!self::$_instance) self::$_instance=new self(); // return self::$_instance; // } // private function __clone(){ // } // public function query($sql){ // } // } //PHP5中魔术方法函数有哪几个,请举例说明各自的用法 // __sleepserialize之前被调用 // __wakeupunserialize时被调用 // __toString打印一个对象时被调用 // __set_state调用var_export时被调用,用 // __set_state的返回值作为var_export的返回值 // __construct构造函数,实例化对象时被调用 // __destruct析构函数,当对象销毁时被调用 // __call对象调用某个方法,若存在该方法,则直接调用,若不存在,则调用 // __call函数__get读取一个对象属性时,若属性存在,则直接返回,若不存在,则调用 // __get函数__set设置一个对象的属性时,若属性存在,则直接赋值,若不存在,则调用 // __set函数__isset检测一个对象的属性是否存在时被调用 // __unsetunset一个对象的属性时被调用 // __clone克隆对象时被调用 // __autoload实例化一个对象时,如果对应的类不存在,则该方法被调用 // //接口和抽象类的区别是什么? // //抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract来声明的。 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法, 抽象方法没有方法体,该方法天生就是要被子类重写的。抽象方法的格式为:abstractfunctionabstractMethod(); 接口是通过interface关键字来声明的,接口中的成员常量和方法都是public的,方法可以不写关键字public, 接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。 子类继承抽象类使用extends,子类实现接口使用implements。 //autoload()函数是如何运作的 // 使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。 当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。 这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误 // // //出下面2个PHP操作Mysql函数的作用和区别 // mysql_num_rows() mysql_affected_rows() 这两个函数都作用于mysql_query($query)操作的结果,mysql_num_rows()返回结果集中行的数目。mysql_affected_rows()取得前一次MySQL操作所影响的记录行数。mysql_num_rows()仅对SELECT语句有效,要取得被INSERT,UPDATE或者DELETE查询所影响到的行的数目,用mysql_affected_rows() // //sql语句应该考虑哪些安全性? // // 防止Sql注入,对特殊字符进行转义、过滤或者使用预编译的sql语句绑定变量。 最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。 当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。 // // //简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部) // 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。 主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARYKEY来创建。 索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引,这就是联合索引。索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件 // //MySQL数据库中的字段类型varchar和char的主要区别是什么?哪种字段的查找效率要高,为什么? // // 区别一,定长和变长 char表示定长,长度固定,varchar表示变长,即长度可变 当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。 区别之二,存储的容量不同 对char来说,最多能存放的字符个数255,和编码无关。 而varchar呢,最多能存放65532个字符 // //请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析? // 1)尽量选择较小的列 // 2)将where中用的比较频繁的字段建立索引 // 3)select子句中避免使用‘*’ // 4)避免在索引列上使用计算、notin和<>等操作 // 5)当只需要一行数据的时候使用limit1 // 6) 保证单表数据不超过200W,适时分割表。 针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况 // //数据库中的事务是什么? // 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID四大特性,原子性、隔离性、一致性、持久性。 // // //php访问数据库有哪几步? //1)连接数据库服务器:mysql_connect('host','user','password'); //2)选择数据库:mysql_select_db(数据库名); //3)设置从数据库提取数据的字符集:mysql_query("setnamesutf8"); //4)执行sql语句:mysql_query(sql语句); //5)处理结果集 //6)关闭结果集,释放资源:mysql_free_result($result);7) 关闭与数据库服务器的连接:mysql_close($link); //