zoukankan      html  css  js  c++  java
  • PHP

     MVC框架是怎样工作的呢?这其实是一个很重要的问题,对于标准的MVC框架来说, Controller层往往是程序的入口(网页的地址就是 Controller层的地址 ) ,然后由Controller层加载 View层进行显示(显示在浏览器上的页面其实并不是你输入的地址),在View层用户通过表单实现交互,表单将数据传回 Controller层,由 Controller层调用Model层进行数据处理、存储、读取等操作,然后Model层将处理结果返回给Controller层, Controller层再次加载View层显示处理的结果,这样就完成了一次完整的、标准的MVC框架下的用户交互动作,在我描述的这个交互过程中,请大家注意两个关键的词语:加载和调用,现在可能还不理解,在接下来的学习中,你将逐步体会到这两个词的区别和关系。为了更加直观的表示,我将整个交互过程用一幅流程图表示,如下所示:

    nginx 配置 /usr/local/nginx/conf/nginx.conf

    在 nginx.conf中增加依稀配置

    location / {
    try_files $uri index.php?$args;
    }
    
    location ~ .php$ {
    
    include fastcgi.conf;
    include fastcgi_params;
    
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    
    fastcgi_param CI_ENV DEVELOPMENT;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }

    /usr/local/php/etc/php.ini和/etc/php.ini 有连个php配置文件,使用的是/usr/local/php/etc/php.ini

    注释掉opcache相关的代码

    ;opcache
    [Zend Opcache]
    ;zend_extension=opcache.so
    ;opcache.memory_consumption=128
    ;opcache.interned_strings_buffer=8
    ;opcache.max_accelerated_files=4000
    ;opcache.revalidate_freq=60
    ;opcache.fast_shutdown=1
    ;opcache.enable_cli=1
    ;opcache end

    http://www.jianshu.com/p/107e83d63975

    1.4 PHP之类和对象

    字数2363 阅读19 评论0 
    1. 一个普通的类的示例:
      <?php
      //定义一个类
      class Car {
         //定义属性
         public $name = '汽车';
         //定义方法
         public function getName() {
             //方法内部可以使用$this伪变量调用对象的属性或者方法
             return $this->name;
         }
      }
      //实例化一个car对象
      $car = new Car();
      $car->name = '奥迪A6'; //设置对象的属性值
      echo $car->getName();  //调用对象的方法 输出对象的名字
      1. 使用 class 定义类;
      2. 使用 new 实例化对象
      3. $objectName -> attributeName 访问对象的属性,注意:属性名前不要加$.
    2. 类名的命名规范
      必须是字母或下划线开头,后面紧跟若干个字母、数字或下划线,类名最好能够表意,可以采用名词或者英文单词。
    3. 属性
      在类中定义的变量称之为属性,通常属性跟数据库中的字段有一定的关联,因此也可以称作“字段”。属性声明是由关键字 publicprotected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。
      class Car {
       //定义公共属性
       public $name = '汽车';
       //定义受保护的属性
       protected $corlor = '白色';
       //定义私有属性
       private $price = '100000';
      }
      默认都为public,外部可以访问。一般通过 -> 对象操作符来访问对象的属性或者方法,对于静态属性则使用 :: 双冒号进行访问。当在类成员方法内部调用的时候,可以使用 $this 伪变量调用当前对象的属性。
      $car = new Car();
      echo $car->name;   //调用对象的属性
      echo $car->color;  //错误 受保护的属性不允许外部调用
      echo $car->price;  //错误 私有属性不允许外部调用
      受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。
      class Car{
       private $price = '1000';
       public function getPrice() {
           return $this->price; //内部访问私有属性   
       }
      }
    4. 定义类的方法
      方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。
      同属性一样,类的方法也具有public,protected 以及 private 的访问控制。
      我们可以这样定义方法:
      class Car {
       public function getName() {
           return '汽车';
       }
      }
      $car = new Car();
      echo $car->getName();
      使用关键字 static 修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号 :: 。
      class Car {
       public static function getName() {
           return '汽车';
       }
      }
      echo Car::getName(); //结果为“汽车”
    5. 构造函数与析构函数
      PHP5可以在类中使用 __construct() 定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

      class Car {
       function __construct() {
           print "构造函数被调用
      ";
       }
      }
      $car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

      在子类中如果定义了_construct则不会调用父类的_construct,如果需要同时调用父类的构造函数,需要使用 parent::__construct() 显式的调用。

      class Car {
        function __construct() {
            print "父类构造函数被调用
      ";
        }
      }
      class Truck extends Car {
        function __construct() {
            print "子类构造函数被调用
      ";
            parent::__construct();
        }
      }
      $car = new Truck();

      同样,PHP5支持析构函数,使用 __destruct() 进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

      class Car {
       function __construct() {
           print "构造函数被调用 
      ";
       }
       function __destruct() {
           print "析构函数被调用 
      ";
       }
      }
      $car = new Car(); //实例化时会调用构造函数
      echo '使用后,准备销毁car对象 
      ';
      unset($car); //销毁时会调用析构函数

      当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

    6. static 静态关键字
      静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名
      的方式进行调用。静态属性不允许对象使用->操作符调用。

      class Car {
        private static $speed = 10;
        public static function getSpeed() {
            return self::$speed;
        }
      }
      echo Car::getSpeed();  //调用静态方法

      静态方法也可以通过变量来进行动态调用

      $func = 'getSpeed';
      $className = 'Car';
      echo $className::$func();  //动态调用静态方法

      静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

      class Car {
        private static $speed = 10;
        public static function getSpeed() {
            return self::$speed;
        }
        public static function speedUp() {
            return self::$speed+=10;
        }
      }
      class BigCar extends Car {
        public static function start() {
            parent::speedUp();
        }
      }
      BigCar::start();
      echo BigCar::getSpeed();
    7. 访问控制
      访问控制通过关键字public,protected和private来实现。

      • 被定义为公有的类成员可以在任何地方被访问。
      • 被定义为受保护的类成员则可以被其自身以及其子类和父类访问。
      • 被定义为私有的类成员则只能被其定义所在的类访问。

      类属性必须定义为公有受保护私有之一。为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。

      class Car {
        $speed = 10;    //错误 属性必须定义访问控制
        public $name;   //定义共有属性
      }

      类中的方法可以被定义为公有私有受保护。如果没有设置这些关键字,则该方法默认为公有

      class Car {
        //默认为共有方法
        function turnLeft() {
        }
      }

      如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

      class Car {
        private function __construct() {
            echo 'object create';
        }
        private static $_object = null;
        public static function getInstance() {
            if (empty(self::$_object)) {
                self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
            }
            return self::$_object;
        }
      }
      //$car = new Car(); //这里不允许直接实例化对象
      $car = Car::getInstance(); //通过静态方法来获得一个实例
    8. 对象继承
      继承是面向对象程序设计中常用的一个特性。汽车是一个比较大的类,我们也可以称之为基类,除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用。
      <?php
       class Car {
           public $speed = 0; //汽车的起始速度是0
           public function speedUp() {
               $this->speed += 10;
               return $this->speed;
           }
       }
       //定义继承于Car的Truck类
       class Truck extends Car {
           public function speedUp() {
               $this->speed = parent::speedUp() + 50;
        }
      }
      $car = new Truck();
      $car->speedUp();
      echo $car->speed;
    9. 重载
      PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。属性的重载通过 __set__get__isset__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
      class Car {
        private $ary = array();
        public function __set($key, $val) {
           $this->ary[$key] = $val;
        }
        public function __get($key) {
            if (isset($this->ary[$key])) {
                return $this->ary[$key];
            }
            return null;
        }
        public function __isset($key) {
            if (isset($this->ary[$key])) {
                return true;
            }
            return false;
        }
        public function __unset($key) {
            unset($this->ary[$key]);
        }
      }
      $car = new Car();
      $car->name = '汽车';  //name属性动态创建并赋值
      echo $car->name;
      方法的重载通过 call 来实现,当调用不存在的方法的时候,将会转为参数调用call方法,当调用不存在的静态方法时会使用 __callStatic 重载。
      class Car {
        public $speed = 0;
        public function __call($name, $args) {
            if ($name == 'speedUp') {
                $this->speed += 10;
            }
        }
      }
      $car = new Car();
      $car->speedUp(); //调用不存在的方法会使用重载
      echo $car->speed;
    10. 对象的高级属性
      对象比较:当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。
      class Car {
      }
      $a = new Car();
      $b = new Car();
      if ($a == $b) echo '==';   //true
      if ($a === $b) echo '==='; //false
      对象复制:在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。
      class Car {
       public $name = 'car';
       public function __clone() {
           $obj = new Car();
           $obj->name = $this->name;
       }
      }
      $a = new Car();
      $a->name = 'new car';
      $b = clone $a;
      var_dump($b);
      对象序列化:可以通过 serialize 方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过 unserialize 将字符串反序列化成对象进行使用。
      class Car {
      public $name = 'car';
      }
      $a = new Car();
      $str = serialize($a); //对象序列化成字符串
      echo $str.'<br>';
      $b = unserialize($str); //反序列化为对象
      var_dump($b);

     

    phpredis是个人觉得最好的一个php-redis客户端,因为其提供的function与redis的命令基本一致,降低的了学习成本,同时功能也很全面。

    一。linux安装方法

    phpredis下载地址:https://github.com/nicolasff/phpredis

    unzip phpredis-master.zip 

    cd phpredis-master

    phpize

    ./configure --with-php-config=/usr/local/php/bin/php-config

    make 

    make install

    vi /usr/local/php5/etc/php.ini

    加入

    extension=redis.so

    保存后重启Apache,如果是连接的nginx,则需要重启php-fpm。

    查看php运行目录命令:
    which php
    /usr/bin/php

    查看php-fpm进程数:
    ps aux | grep -c php-fpm

    查看运行内存
    /usr/bin/php  -i|grep mem

    重启php-fpm
    /etc/init.d/php-fpm restart

    PHP 变量名大小写问题:

    1. 变量名区分大小写

    2. 函数名、方法名、类名不区分大小写

    ===是包括变量值与类型完全相等,而==只是比较两个数的值是否相等。
    比如:100==“100” 这里用==,因为它们的值相等,都是100,结果为真
    但是若用===,因为左边是一个整型而右边则是一个字符串类型的数,类型不相同所以结果为假。

    @符号在php中是抑制错误提示用的。一般在可预知bug 的地方,加一个@符号来防止程序崩溃停止。比如unlink删除文件,如果没有找到要删除的文件,系统会报错,可以加一个@来防止程序停止。
    不过一般用的很少,也尽量少用。

     PHP 时间戳:

    <?php
    date_default_timezone_set(“prc”);
    
    $stringtime = date(“Y-m-d H:i:s”,time());
    
    echo $stringtime.”<br/>”;
    
    echo strtotime($stringtime).”<br/>”;
    
    echo date(“Y/m/d G:i:s A”,strtotime($stringtime));
    ?>

    运行结果:

    2010-06-21 17:29:32 
    1277112572 
    2010/06/21 17:29:32 PM

    PHP 处理从命令行获取的参数

    列表C
    
    代码 
    <?php
    // check for all required arguments
    // first argument is always name of script!
    if ($argc != 4) { 
    die("Usage: book.php <check-in-date> <num-nights> <room-type> ");
    }
    
    // remove first argument
    array_shift($argv);
    
    // get and use remaining arguments
    $checkin = $argv[0];
    $nights = $argv[1];
    $type = $argv[2];
    echo "You have requested a $type room for $nights nights, checking in on $checkin. Thank you for your order! ";
    ?>
    
    
    下面是其用法的示例:
    
    shell> php phpbook.php 21/05/2005 7 single
    You have requested a single room for 7 nights, checking in on 21/05/2005. Thank you for your order!
    
    在这里,脚本首先会检查$argc,以确保自变量的数量符合要求。它然后会从$argv里提取出每一个自变量,把它们打印输出到标准的输出。

    原 Mac OSX 10.9搭建nginx+mysql+php-fpm环境

    http://my.oschina.net/chen0dgax/blog/190161

    安装homebrew

    homebrew是mac下非常好用的包管理器,会自动安装相关的依赖包,将你从繁琐的软件依赖安装中解放出来。 
    安装homebrew也非常简单,只要在终端中输入:

    <!-- lang: shell -->
    ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
    

    homebrew的常用命令:

    <!-- lang: shell -->
    brew update #更新可安装包的最新信息,建议每次安装前都运行下
    brew search pkg_name #搜索相关的包信息
    brew install pkg_name #安装包
    

    想了解更多地信息,请参看homebrew

    安装nginx

    安装

    <!-- lang: shell -->
    brew search nginx
    brew install nginx
    

    当前的最新版本是1.4.4

    配置

    <!-- lang: shell -->
    cd /usr/local/etc/nginx/
    mkdir conf.d
    vim nginx.conf
    vim ./conf.d/default.conf
    

    nginx.conf内容,

    <!-- lang: shell -->
    worker_processes  1;  
    
    error_log       /usr/local/var/log/nginx/error.log warn;
    
    pid        /usr/local/var/run/nginx.pid;
    
    events {
        worker_connections  256;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log      /usr/local/var/log/nginx/access.log main;
        port_in_redirect off;
        sendfile        on; 
        keepalive_timeout  65; 
    
        include /usr/local/etc/nginx/conf.d/*.conf;
    }
    

    default.conf文件内容,

    <!-- lang: shell -->
    server {
        listen       8080;
        server_name  localhost;
    
        root /Users/user_name/nginx_sites/; # 该项要修改为你准备存放相关网页的路径
    
        location / { 
            index index.php;
            autoindex on; 
        }   
    
        #proxy the php scripts to php-fpm  
        location ~ .php$ {
            include /usr/local/etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on; 
            fastcgi_pass   127.0.0.1:9000; 
        }   
    
    }
    

    安装php-fpm

    Mac OSX 10.9的系统自带了PHP、php-fpm,省去了安装php-fpm的麻烦。 
    这里需要简单地修改下php-fpm的配置,否则运行php-fpm会报错。

    <!-- lang: shell -->
    sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
    vim /private/etc/php-fpm.conf
    

    修改php-fpm.conf文件中的error_log项,默认该项被注释掉,这里需要去注释并且修改为error_log = /usr/local/var/log/php-fpm.log。如果不修改该值,运行php-fpm的时候会提示log文件输出路径不存在的错误。

    安装mysql

    安装

    <!-- lang: shell -->
    brew install mysql
    

    常用命令

    <!-- lang: shell -->
    mysql.server start #启动mysql服务
    mysql.server stop #关闭mysql服务
    

    配置 
    在终端运行mysql_secure_installation脚本,该脚本会一步步提示你设置一系列安全性相关的参数,包括:设置root密码关闭匿名访问不允许root用户远程访问移除test数据库。当然运行该脚本前记得先启动mysql服务。

    测试nginx服务

    在之前nginx配置文件default.conf中设置的root项对应的文件夹下创建测试文件index.php:

    
    <!-- ~/nginx_sites/index.php -->
    <?php phpinfo(); ?>
    

    启动nginx服务,sudo nginx; 
    修改配置文件,重启nginx服务,sudo nginx -s reload 
    启动php服务,sudo php-fpm; 
    在浏览器地址栏中输入localhost:8080,如果配置正确地话,应该能看到PHP相关信息的页面。

    参考资料

      1. Chen Shan的博文:Installing Nginx and PHP-FPM on Mac OS X
      2. 英文资料:Installing Nginx, PHP-FPM and APC on Mac OS X
      3. D.H.Q的博文:Mac下nginx、mysql、php-fpm的安装配置
     
    CI nginx 配置
    server {
        listen       80;
        server_name  localhost;
        index index.html index.htm index.php;
    
        #root /Users/diego/work/; # 该项要修改为你准备存放相关网页的路径
        root /Users/diego/work/activity;
    
            #location / {
            #    index index.php;
            #    autoindex on;
            #}
    
            location ~ .(html|jpg|png|gif|ico|js|css|mp4|eot|svg|ttf|woff|mp3|json|woff2|pom|jar)$ {
                add_header    Cache-Control  no-store;
                root /Users/diego/work/activity/static;
                access_log /Users/diego/work/activity/static.log;
                index   index.html;
            }
    
            location / {
                try_files $uri index.php?$args;
            }
    
    
    #proxy the php scripts to php-fpm
        #location ~ .php$ {
        #    include /usr/local/etc/nginx/fastcgi.conf;
        #    fastcgi_intercept_errors on;
        #    fastcgi_pass   127.0.0.1:9000;
        #}
        location ~ .php$ {
    
            include fastcgi.conf;
            include fastcgi_params;
    
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
    
            fastcgi_param  CI_ENV DEVELOPMENT;
            fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME    $document_root/$fastcgi_script_name;
        }
    
    }
     

    Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.

    运行/usr/local/webserver/php/bin/phpize时出现:
    Configuring for:
    PHP Api Version:         20041225
    Zend Module Api No:      20060613
    Zend Extension Api No:   220060519
    Cannot find autoconf. Please check your autoconf installation and the
    $PHP_AUTOCONF environment variable. Then, rerun this script.
    根据网上的解决办法是:
    
    # cd /usr/src
    # wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
    # tar -zvxf m4-1.4.9.tar.gz
    # cd m4-1.4.9/
    # ./configure && make && make install
    # cd ../
    # wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
    # tar -zvxf autoconf-2.62.tar.gz
    # cd autoconf-2.62/
    # ./configure && make && make install
    更简单的办法
    # yum install m4
    # yum install autoconf





    如何安装 Composer

    安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php -v 查看是否正确输出版本号。

    打开命令行并执行下列命令安装最新版本的 Composer (以下指令摘自 https://getcomposer.org/download/,请前往查看最新的安装指令):

    php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
    
    php composer-setup.php
    
    php -r "unlink('composer-setup.php');"
    

    执行第一条命令下载下来的 composer-setup.php 脚本将简单的检测 php.ini 中的参数设置,如果某些参数未正确设置则会给出警告;然后下载最新版本的 composer.phar 文件到当前目录。

    上述 3 条命令的作用依次是:

    1. 下载安装脚本(composer-setup.php)到当前目录。
    2. 执行安装过程。
    3. 删除安装脚本 -- composer-setup.php 。
    然后把composer.phar移动到环境下让其变成可执行
    [root@localhost opt]# mv composer.phar /usr/local/bin/composer
    [root@localhost opt]# composer -V
    Composer version 1.0-dev (8775c948956c9e0e0a5fd723cd84c94b3ea3d7e9) 2015-07-01 09:29:53

    composer  安装

    http://pkg.phpcomposer.com/#how-to-install-composer

     

    PHP魔术方法之__call与__callStatic方法

    <?php
    
    class human{
    
    private function t(){
      }
    
    //魔术方法__call
    /*
    $method 获得方法名
    $arg 获得方法的参数集合
    */
    public function __call($method,$arg){
        echo '你想调用我不存在的方法',$method,'方法<br/>';
        echo '还传了一个参数<br/>';
        echo print_r($arg),'<br/>';
      }
    //魔术方法__callStatic
    public static function __callStatic($method,$arg){
    
        echo '你想调用我不存在的',$method,'静态方法<br/>';
        echo '还传了一个参数<br/>';
        echo print_r($arg),'<br/>';
      }
    
    }
    
    $li=new human();
    $li->say(1,2,3);
    /*
    调用一个未定义的方法
    Fatal error: Call to undefined method human::say() in D:wampwwwphp59.php on line 8
    */
    
    $li->t('a','b');
    /* 
    __call是调用不可见(不存在或无权限)的方法时,自动调用 
    $lisi->say(1,2,3);-----没有say()方法----> __call('say',array(1,2,3))运行 
    */ 
    
    human::cry('痛哭','鬼哭','号哭');
    /* 
    __callStatic 是调用不可见的静态方法时,自动调用. 
    Human::cry('a','b','c')----没有cry方法---> Human::__callStatic('cry',array('a','b','c')); 
    */ 
    
    ?>

     

    <?php
    
    class Account {
        public $user = 1;
        public $pwd = 2;
    
        public function __toString() {
            return "current user:{$this->user}, current pwd:{$this->pwd}
    ";
        }
    }
    
    $a = new Account();
    
    echo $a;
    echo PHP_EOL;
    print_r($a);
    var_dump($a);

    输出

    current user:1, current pwd:2
    
    Account Object
    (
        [user] => 1
        [pwd] => 2
    )
    object(Account)#1 (2) {
      ["user"]=>
      int(1)
      ["pwd"]=>
      int(2)
    }

     interface

    interface employee {
        public function working() ;
    }
    
    class teacher implements employee{
        public function working() {
            echo 'teaching';
            echo PHP_EOL;
        }
    }
    
    class coder implements employee{
        public function working() {
            echo 'coding';
            echo PHP_EOL;
        }
    }
    
    function doprint(employee $i) {
        $i->working();
    }
    
    $a = new teacher();
    $b = new coder();
    
    doprint($a);
    doprint($b);

    继承

    class employee {
        protected function working() {
            echo 'emplyee working';
            echo PHP_EOL;
        }
    }
    
    class teacher extends employee {
        public function working() {
            echo 'teaching';
            echo PHP_EOL;
        }
    }
    
    class coder extends employee {
        public function working() {
            echo 'coding';
            echo PHP_EOL;
        }
    }
    
    function doprint($obj) {
        if(get_class($obj) == 'employee') {
            echo 'Error';
            echo PHP_EOL;
        } else {
            $obj->working();
        }
    }
    
    doprint(new employee);
    doprint(new teacher);
    doprint(new coder);

    PHP 中对象的赋值默认是引用赋值。 基本类型是传值赋值

    ?php
    
    class teacher {
        public $name = "tc";
        public function working() {
            echo 'teaching';
            echo PHP_EOL;
        }
    }
    
    $a = new teacher();
    $b = $a;
    $b->name = "TC";
    var_dump($a);
    var_dump($b);
    
    $c = "abc";
    $d = $c;
    $d = "bcd";
    
    var_dump($c);
    var_dump($d);
    
    $e = "cde";
    $f = &$e;//引用
    $f = "def";
    
    var_dump($e);
    var_dump($f);

    output

    ➜  phpTest php assign.php
    object(teacher)#1 (1) {
      ["name"]=>
      string(2) "TC"
    }
    object(teacher)#1 (1) {
      ["name"]=>
      string(2) "TC"
    }
    string(3) "abc"
    string(3) "bcd"
    string(3) "def"
    string(3) "def"

     

     file_exist 文件是否存在

    class_exist 类是否存在

    ge't_class 获取对象的类名

    get_class_methods 获取类的方法Array

    get_class_vars 获取类的成员变量(属性)(public only)

    is_callable/method_exist 函数是否可以调用

     get_parent_class 获取父类 

    is_subclass_of 判断某个对象是否是某个类的子类

    class_implements 某个对象实现的接口的数组

     call_user_func/call_user_func_array 函数调用

    细节:php array会把string key自动转成int吗?

     

    PHP array和别的语言不一样。

    PHP数组的key可以为int,也可以为string,引申出下面的问题。

    <?php
    $a = array(
        1 => 'as',
        2 => '22',
    );
    var_dump($a[0]);
    var_dump($a[2]);
    var_dump($a['2']);
    exit;
    ?>

    结果:$a[0]未定义,$a[2] 与 $a['2']相同。

    <?php
    $a = array(
        '1' => 'as',
        '2' => '22',
    );
    var_dump($a[0]);
    var_dump($a[2]);
    var_dump($a['2']);
    exit;

    结果:$a[0]未定义,$a[2] 与 $a['2']相同。

    问题:string作为key,然后输出是string还是int。

    <?php
    $a = array(
        '1' => 'as',
        '2' => '22',
    );
    foreach($a as $k=>$v) {
        if($k === 1) {
            echo 'int';
        }
    }
    exit;

    结果:输出int。

    问题:现在可以得出结论说php array会自动把数字字符串的key转成int?请看下面的例子。

    参考:http://www.cnblogs.com/sink_cup/archive/2010/12/12/php_intval_mysql_int.html

    <?php
    $a = array(
        'asdf' => 'a',
        '2' => '22',
        '2147483647' => '32 max',
        '2147483648' => '32 max + 1',
        '9223372036854775807' => '64 max',
        '9223372036854775808' => '64 max + 1',
        9223372036854775809 => '64 max + 2',
    );
    foreach($a as $k=>$v) {
            var_dump($k);
            echo ' ';
            var_dump($v);
    }
    exit;

    在64位的机器上输出:

    string(4) "asdf"
     string(1) "a"
    int(2)
     string(2) "22"
    int(2147483647)
     string(6) "32 max"
    int(2147483648)
     string(10) "32 max + 1"
    int(9223372036854775807)
     string(6) "64 max"
    string(19) "9223372036854775808"
     string(10) "64 max + 1"
    int(-9223372036854775808)
     string(10) "64 max + 2"

    结论:php的int取值范围与系统有关,在int的有效范围内,php array会把数字字符串的key转成int;当key超过int范围时,不再转换。

    但是php用json_encode方法时候,会遇到问题。 

    因为: 

    PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。 

    由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

    比如,现在有一个索引数组 

      $arr = Array('one', 'two', 'three');   
      echo json_encode($arr);   

    结果为: 

      ["one","two","three"]   

    如果将它改为关联数组: 

      $arr = Array('1'=>'one', '2'=>'two', '3'=>'three');   
      echo json_encode($arr);     

    结果就变了: 

      {"1":"one","2":"two","3":"three"}

    浏览器使用x-www-form-urlencoded 方式发送数据额的时候,数据都是key=value$key=value 这种方式 详见http://www.cnblogs.com/diegodu/p/5481225.html

    CI客户端可以直接使用$this->input->post('some_data');来获取数据

    例如

    POST /sendNote/testPost HTTP/1.1
    Host: 10.211.55.3
    Content-Type: application/x-www-form-urlencoded
    Cache-Control: no-cache
    Postman-Token: 110094e2-8307-20ef-1146-5a7ed5be3dbe
    
    name=zhangsan&pwd=123456

    服务器端可以这样接收:

    public function testPost() {
            // 1. get user list
            $name= $this->input->post('name');
            $pwd= $this->input->post('pwd');
            echo "$name	";
            echo "$pwd";
            return ;
        }
  • 相关阅读:
    安装浏览器的vue插件
    webpack学习笔记-2-file-loader 和 url-loader
    webpack4.x最详细入门讲解
    简单地使用webpack进行打包
    vue动态监听浏览器窗口高度
    Vue 中 export及export default的区别
    vue 路由懒加载 resolve vue-router配置
    javascript深入理解js闭包
    JS截取字符串常用方法详细整理
    糗事之 -- 用ssh公钥实现免密码登录
  • 原文地址:https://www.cnblogs.com/diegodu/p/5383892.html
Copyright © 2011-2022 走看看