zoukankan      html  css  js  c++  java
  • 宋体字符串php入门第六天

    最近用使开发的过程中现出了一个小问题,顺便记录一下原因和方法--宋体字符串

        活灵的符字串。

       因为$抒发的活灵性,我们可以用“映射”的方法,调出符字串或者数函。

        <?php

        $a = 'b';

        $b = '123';

        echo $$a; // 这可以输出123。不过比拟好的惯习是echo ${$a},这样更清晰了明。

        $c = 'd';

        echo $c();

        function d() {return '321';} // $c()调用的是d数函

        ?>

        php的符字串和javascriptpython似类,在单引号中用不把双引号写成\",在双引号中也用不转义单引号。但是,因为php中有风趣的$存在,所以双引号要杂复一些。看例子。

        <?php

        $aa = 'abc';

        echo "'$aa'";

        echo "\{$aa}"; // 这样写 PHP5.1.1前以后会示显不同的结果

        echo "\\{{$aa}}"; // 这样写就没问题

        ?>

       双引号中可以有变量,可以用"$a""{$a}"式形来现表,个人议建大家多用面前的写法,第一编辑器会高亮,第二能写更杂复的式子。要注意,虽然"'{$a}'"的结果和"'".$a."'"的结果一样,但是{并非'"的简写,echo "'{__FILE__}'"echo "'".__FILE__."'"结果是不同的。因为双引号中的关闭区间是以 {$ xxxx } 种这结构(或${xxxx}结构,不过这个和双引号表面的结构不一样,我不太欢喜)。所以可以写{$this->func()},不能写{self::func()},{常量}

    <?php
    
    function demo() {return 'abc';}
    function abc() {return '123';}
    $func = function() {return 'function';}; // 须要php5.3以上版本
    $abc = 'abc';
    $abc1 = 'abc--one::';
    echo ${demo().'1'};
    echo ${demo('}}')}();
    echo "\{{${demo()}()}:::{$func()}\}{\$";
    
    $test = 'Test';
    echo ":::<br/>{$test::func()}:::";
    
    class Test
    {
    	static public function func()
    	{
    		return 'static func';
    	}
    }
    
    ?>

       虽然php的双引号很壮大,但很多场所不并太须要要生成页面,很多时候可以这样写:

        $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value, $name).'" />'."\n";

       这个是CI框架中form_helper.phpform_hidden的一行代码。

       要输出的单引号多时,用双引号括符字串。反之用单位引号。单引号和双引号相比,用来括符字串效率不并会高多少,虽然单引号只须要转义\\\',双引号的有

        

    Sequence

    Meaning

    \n

    换行 (LF or 0x0A (10) in ASCII)

    \r

    回车 (CR or 0x0D (13) in ASCII)

    \t

    水平向方的 tab(HT or 0x09 (9) in ASCII)

    \v

    竖直向方的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)

    \f

    页换 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)

    \\

    反斜线

    \$

    美金dollar记标

    \"

    双引号

    \[0-7]{1,3}

    符合该抒发式序顺的符字串是一个八进制的符字

    \x[0-9A-Fa-f]{1,2}

    符合该抒发式序顺的符字串是一个十六进制的符字

       这么多要转义,但我想序程在历遍每个符字时,实际上它最初只须要判断 \ " $ ,可能还有 {。 

        那么双引号和单引号一样多时该应怎么输出呢?我们先看一下别的语言的解决方案。

        Python 可以用 ''' 或者 """ 来闭合符字串,这中之不并需转义"',有须要的话,可以写成这样  '''这样'''+"'''"

        因为php是一个模版语言,所以想直接输出的话(最好写大用引的模版文件里),直接写html就能够了。

        不直接输出的话, php 用的是 heredoc语法结构和nowdoc(语法结构自PHP 5.3.0后以

        Heredoc是以 <<<xxxx 扫尾以 xxxx; 尾结;Nowdoc是以 <<<'xxxx' 扫尾以 xxxx;尾结。注意xxxx;尾结要在回车后且和回车句语之间不能有别的符字。

        每日一道理
    聪明人学习,像搏击长空的雄鹰,仰视一望无际的大地;愚笨的人学习,漫无目的,犹如乱飞乱撞的无头飞蛾;刻苦的人学习,像弯弯的河流,虽有曲折,但终会流入大海;懒惰的人学习,像水中的木头,阻力越大倒退得越快。
    <?php
    
    $a = 'abc';
    $b = 'html';
    $c = <<<html
    '{$b}'
    
    html;
    
    $d = "'{$b}'
    ";
    
    if ($c === $d)
    {
    	echo <<<abc
    \$c === \$d:::'{$a}' {$c}
     abc<br/>
    abc;
    	echo <<<'test'
    \$c === \$d:::'{$a}' {$c}
     'test'
     test<br/>
    test;
    }
    
    ?>

       Javascript没有生原的方法,但是依托html,还是可以解决问题。

       上面写个iframe异步提交的例子。

    <?php
    /* iframe_test.php */
    if (isset($_POST['cmd']))
    {
    	// 正规的写法是用引模版文件。
    	?>
    	
    <textarea id="show-div"><?php 
    	echo $_POST['textarea'];
    ?></textarea>	
    
    <script>
    var a = document.getElementById("show-div").value;
    
    parent.show(document.getElementById("show-div").value);
    
    </script>
    	<?php
    }
    
    ?>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>Welcome to CodeIgniter</title>
    
    </head>
    
    <body>
    
    <iframe name="iframe_show" width="0" height="0" scrolling="no" style="display:none">
    </iframe>
    
    <h1>js在文件面前!</h1>
    
    <form name="mainform" target="iframe_show" method="post" enctype="multipart/form-data">
    	<textarea name="textarea"><script>alert(123)</script></textarea>
    	<input type="submit" name="cmd" value="提交" />
    	<input type="reset" value="撤消" />
    </form>
    
    <div id="show">Hello World</div>
    
    </body>
    
    <style type="text/css">
    </style>
    <script>
    //<![CDATA[
    function show(str) {
    	alert(str);
    	document.getElementById("show").innerHTML = str;
    }
    //]]>
    </script>
    
    </html><?php /* iframe_test.php */

       作为组数的键的符字串:

       php的组数的键只有两种类型,整数和符字串,'0'~'9'会被认是整数或转成整数。见下例。

    <?php
      
    $arr_type = array(
      0x34 => '0x34',
      1 => '1',
      '1' => "'1'",
      1.99 => '1.99',
      true => 'true',
      0 => '0',
      false => 'false',
      '0' => "'0'",
      0.0 => '0.0',
      0.01 => '0.01',
      .99 => '0.99',
      -1 => '-1',
      '1.99' => "''1.99'
      '",
    );
      
    var_dump($arr_type, json_encode($arr_type), json_encode($arr_type));
      
    if (1 !== true)
    {
      echo count($arr_type),'<br/>';
      echo $arr_type[1.99],'<br/>';
      echo $arr_type[false],'<br/>';
      echo $arr_type['1.99'],'<br/>';
      echo $arr_type[-1],'<br/>';
      echo $arr_type[0x34],'<br/>';
    }
      
    ?>

        上例的组数只有五行,多少可以预感,但上面的echo 却能用false 1.99这样的非整数键畸形输出。程编是一种严厉的事,我们不希望现出多许外意的结果;而且种这转义必定度程上影响效率。别的语言的种这数据结构,会有严厉式模和宽松式模,比如lisp有这两种式模,python只有严厉式模(hash={'1': 1}; print(hash[1]);#这个会报错——话说python虽然说是脚本语言,但是最开始计设时,比别的脚本语言要严厉的多,所以试测性比别的脚本语言好。如果你哪天想计设一个自己的语言,先要向严厉向方计设,后以留个ini让别人配置;写好了的序程,由严厉向宽松转轻易,宽松到转严厉式模,很多时候完整地不可能或目测上不可能)。但php的组数,只有种这宽松式模,希望php5.6能出点新东西。

       Javascript也差未几,不过键都是符字串。写的代码如果键是数负,不会转成符字串。tureflase会被转成'true''flase'.

    <script>
    
    var arr = {
    	a: '47a',
    	'b': 12,
    	1: '1',
    	/* -1: '-1', */
    	1.99: '1.99',
    	'-1': '-1',
    	false: 'false',
    	0: '0',
    	'0': 'char0',
    };
    var i;
    var str = '';
    for (i in arr) {
    	str += typeof(i)+': '+i+' => '+arr[i]+'\n';
    }
    if (1 !== true) {
    	alert([
    		arr['1'],
    		arr[1.99],
    		arr[-1],
    		arr['a'],
    		arr[false],
    		arr[0],
    		arr['0'],
    		str,
    	]);
    }
    
    </script>

       DartJavascript差未几,也是只能用符字串作键,但是不并会转义。上面例子会报错。个人不并看好dart的景前,只是写东西时一时崛起,拿来测测看下。果然语言不同,便有各种微差异,想到自己很多时候php用多了,用js时便想当然为以也如此,便好笑了。上面的Dart代码会报错

        void main() {

          print("Hello, World!");

          var a = {'1': 1};

          var b = {1: 1}; // 报错原因

          print(a['1']);

          print(a[1]); // 报错原因

        }

       在有的配置下,php能这样写,$arr = array('key' => 'val'); echo $arr[key]; 但是种这写法,php会首先看key是否是常量(php自带的常量都有上千个),如果不是常量,就作符字串。所以种这写法效率很低下,比$arr['key']慢几倍(常量多的目项,还要更慢)echo "$arr[key]"则和echo "{$arr['key']}的效率差未几,因为双引号中不须要斟酌常量。一般来说$arr[key]种这写法少打字又清晰,但多打两个会使你的序程环保一些,通用一些,也是不难做到的。

       如果

        php

        的常量像变量一样,面前有个缀前,如

        #,

        横竖有

        //

        替代

        #

        。一般写

        $arr[key]

        就用不斟酌常量,效率高又便利序程员。写

        $arr[#key]

        的情况未几,有须要时写成

        $arr['#key']

        。或者学

        erlang

        的(我比拟不欢喜

        erlang

        那种从

        prolog

        那继承的语法

        , 

        更惯习看

        c

        或

        lisp

        那种语法

        )

        ,使“变量”只能用使大写和下划线定名,非纯大写和下划线用于“原子”的定名;

        php

        自带的常量都是大写的,我见过的

        php

        目项,常量都是用大写字母和下划线定名,可能有少极不是,而表单的

        name

        值在大部分目项中都是小写,这样少数组数就只用非纯大写和下划线就能够了。如果

        5.6

        能出这个能功,改个

        ini

        就实现的话,少数公司的

        php

        新目项,计估都会用这个能功。

    文章结束给大家分享下程序员的一些笑话语录: Bphone之你们聊,我先走了!移动说:我在phone前加o,我叫o缝;苹果说:我在phone前i,我是i缝;微软说:我在phone前加w,我叫w缝;三星说:你们聊,我先走了!
    将来王建宙写回忆录的时候,一定要有一句“常小兵为中国移动的发展做出了不可磨灭的贡献”。

  • 相关阅读:
    JavaSE基础(七)--Java流程控制语句之switch case 语句
    JavaSE基础(六)--Java流程控制语句之条件语句
    JavaSE基础(五)--Java运算符
    搭建seafile文档系统
    centos7 DHCP搭建双机热备 集群
    centos7安装DHCP后启动不了的问题解决方法
    思科ASA防火墙精华配置总结
    思科常用命令大全
    浅谈集线器、路由器、交换机、网关的作用与区别
    交换机端口镜像及其工作原理
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3050703.html
Copyright © 2011-2022 走看看