PHP基础

----------------------------------------------------
PHP 5 数据类型

String(字符串), 
Integer(整型), Float(浮点型), 
Boolean(布尔型),
Array(数组), 
Object(对象), 
NULL(空值)
----------------------------------------------------
并置运算符 (.) 用于把两个字符串值连接起来
strlen() 函数返回字符串的长度
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE


<!--test1.php-->
<!DOCTYPE html> 
<html> 
<body> 
<?php 
$txt1="Hello world!"; 
$txt2="What a nice day!"; 
echo $txt1 . " " . $txt2; 
echo "\n";                     // echo "\n";  换行
echo "length:" . strlen("Hello world!");   // strlen() 函数返回字符串的长度   一个中文占 3 个字符数
echo "\n";
echo "findIndex(world) " . strpos("Hello world!","world");    // 返回搜到的索引的位置
echo "\n";
echo "findIndex(zuk) " . strpos("Hello world!","zuk");   // 返回False
?>

</body> 
</html>

<!--
Hello world! What a nice day!
length:12
findIndex(world) 6
findIndex(zuk) 
-->
----------------------------------------------------
PHP EOF(heredoc)是一种在命令行shell和程序语言里定义一个【多行字串】的方法
能在字串中 拼接字符串

<!--test2.php-->
<!DOCTYPE html> 
<html> 
<body> 
<?php
$name="runoob";
$a= <<<EOF
    "abc"$name
    "123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
</body> 
</html>

<!--
输出结果:
    "abc"runoob
    "123" 
-->

----------------------------------------------------
PHP var_dump() 函数返回变量的数据类型和值:int(5985) 

<!--test3.php-->
<!DOCTYPE html>
<html>
<body>

<?php 
$x = 5985;
var_dump($x);
echo "<br>"; 
$x = -345; // 负数
var_dump($x);
echo "<br>"; 
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);

$x = 10.365; //浮点数
var_dump($x);
echo "<br>"; 
$x = 2.4e3;   // 浮点数指数形式   2.4 * 10(3)  2.4乘10的三次方  2400
var_dump($x);
echo "<br>"; 
$x = 8E-5;    //浮点数指数形式   8 * 10(-5)
var_dump($x);
$x=true;
var_dump($x);  //布尔值形式  
$y=false;
var_dump($y);

$cars=array("Volvo","BMW","Toyota");  
var_dump($cars);  // 数组类型


class Car
{
  var $color;
  function Car($color="green") {
    $this->color = $color;
  }
  function what_color() {
    return $this->color;
  }
}

$mCar=new Car("red");
var_dump($mCar);   // Object(对象)类型

$x=null;
var_dump($x);   // 空类型



?>   

</body>
</html>


<!--
输出结果:
nt(5985)

int(-345)

int(140)

int(39)
float(10.365)

float(2400)

float(8.0E-5)
bool(true)
bool(false)
array(3) {
  [0]=>
  string(5) "Volvo"
  [1]=>
  string(3) "BMW"
  [2]=>
  string(6) "Toyota"
}
object(Car)#1 (1) {
  ["color"]=>
  string(3) "red"
}
NULL
-->

----------------------------------------------------
设置常量,使用 define() 函数,函数语法如下
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的

<!--test4.php-->
<!DOCTYPE html>
<html>
<body>

<?php
// 区分大小写的常量名 第三个参数 Boolean 用于区分变量大小写不敏感 
define("GREETING", "欢迎世界",true);
echo GREETING;    // 输出 "欢迎世界"
echo '<br>';
echo greeting;   // 输出 欢迎世界
?>


</body>
</html>

<!--
输出结果:
欢迎世界
欢迎世界
-->



----------------------------------------------------
PHP  if语句   switch语句
while - 只要指定的条件成立,则循环执行代码块
do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环


<!--test5.php-->
<!DOCTYPE html>
<html>
<body>

<?php
$t=date("H");
if ($t<"10")
{
    echo "Have a good morning!";
}
elseif ($t<"20")
{
    echo "Have a good day!";
}
else
{
    echo "Have a good night!";
}

 echo "\n";
$favcolor="red";
switch ($favcolor)
{
case "red":
    echo "你喜欢的颜色是红色!";
    break;
case "blue":
    echo "你喜欢的颜色是蓝色!";
    break;
case "green":
    echo "你喜欢的颜色是绿色!";
    break;
default:
    echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}


$i=1;
while($i<=5)
{
    echo "The number is " . $i . "<br>";
    $i++;
}



$i=5;
do
{
    $i++;
    echo "The number is " . $i . "<br>";
}
while ($i<=10);
?>

</body>
</html>

<!--
输出结果:
Have a good day!
你喜欢的颜色是红色!The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
The number is 7
The number is 8
The number is 9
The number is 10
The number is 11

-->

----------------------------------------------------
array() 函数用于创建数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
获取数组的长度 - count() 函数
遍历并打印数值数组中的所有值,您可以使用 for 循环
array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); 实现Map类似的数组
历并打印关联数组中的所有值,您可以使用 foreach 循环

<!--test6.php-->
<!DOCTYPE html>
<html>
<body>

<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
echo "\n";
$cars[0]="benz";
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
echo "\n";
echo "array.length: " . count($cars);

$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)  // for循环语句  遍历值数组
{
    echo $cars[$x];
    echo "<br>";
}


$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); // map类似的数组
$age['Peter']="100"; // 访问数组索引使用key
foreach($age as $x=>$x_value)  // 遍历Map形式的数组
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}
echo "<br>";    
var_dump($age); 
?>

</body>
</html>

<!--
输出结果:

I like Volvo, BMW and Toyota.
I like benz, BMW and Toyota.
array.length: 3benz
BMW
Toyota
Key=Peter, Value=100
Key=Ben, Value=37
Key=Joe, Value=43

array(3) {
  ["Peter"]=>
  string(3) "100"
  ["Ben"]=>
  string(2) "37"
  ["Joe"]=>
  string(2) "43"
}

-->

----------------------------------------------------
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列


<!--test7.php-->
<!DOCTYPE html>
<html>
<body>

<?php
$numbers=array(4,6,2,22,11);
echo "原始排序:";
var_dump($numbers);
echo "<br>";
echo "正向排序:";
sort($numbers);
var_dump($numbers);
echo "<br>";
echo "逆向排序:";
rsort($numbers);
var_dump($numbers);
echo "<br>";




$age=array("Ceter"=>"100","Ben"=>"10","Aoe"=>"43");
echo "原始Map序列:";
echo "<br>";
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}

echo "<br>";

asort($age);
echo "依据Map的Value进行正序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}

echo "<br>";
ksort($age);
echo "依据Map的Key进行正序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}


echo "<br>";
arsort($age);
echo "依据Map的Value进行逆序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}




echo "<br>";
krsort($age);
echo "依据Map的Key进行逆序排序:";
echo "<br>";
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}

echo "<br>";
var_dump($age);
?>

</body>
</html>
<!--
原始排序:array(5) {
  [0]=>
  int(4)
  [1]=>
  int(6)
  [2]=>
  int(2)
  [3]=>
  int(22)
  [4]=>
  int(11)
}

正向排序:array(5) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(6)
  [3]=>
  int(11)
  [4]=>
  int(22)
}

逆向排序:array(5) {
  [0]=>
  int(22)
  [1]=>
  int(11)
  [2]=>
  int(6)
  [3]=>
  int(4)
  [4]=>
  int(2)
}

原始Map序列:
Key=Ceter, Value=100
Key=Ben, Value=10
Key=Aoe, Value=43

依据Map的Value进行正序排序:
Key=Ben, Value=10
Key=Aoe, Value=43
Key=Ceter, Value=100

依据Map的Key进行正序排序:
Key=Aoe, Value=43
Key=Ben, Value=10
Key=Ceter, Value=100

依据Map的Value进行逆序排序:
Key=Ceter, Value=100
Key=Aoe, Value=43
Key=Ben, Value=10

依据Map的Key进行逆序排序:
Key=Ceter, Value=100
Key=Ben, Value=10
Key=Aoe, Value=43


array(3) {
  ["Ceter"]=>
  string(3) "100"
  ["Ben"]=>
  string(2) "10"
  ["Aoe"]=>
  string(2) "43"
}

-->




----------------------------------------------------
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
PHP中预定义了几个超级全局变量(superglobals) 
这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
http://www.runoob.com/php/php-superglobals.html
$GLOBALS   
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION

$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问
是一个包含了全部变量的全局组合数组。变量的名字就是数组的键

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
这个数组中的项目由 Web 服务器创建


$_REQUEST 用于收集HTML表单提交的数据。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。
当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件


 $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 
当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。


$_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"$_GET 也可以收集URL中发送的数据。


<!--test7.php-->
<!DOCTYPE html>
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>


<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname2">
<input type="submit">
</form>

<a href="test_get.php?subject=PHP&web=www.baidu.com">Test $GET</a>

<?php 

$name = $_REQUEST['fname']; 
echo $name; 

$name2 = $_REQUEST['fname2']; 
echo $name2; 


echo "Study " . $_GET['subject'] . " at " . $_GET['web'];

$x = 75; 
$y = 25;

function addition() 
{ 
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
addition(); 
echo $z;  //z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问

echo "<br>";
echo "------------------------";
echo "<br>";
var_dump($GLOBALS);


?>

</body>
</html>


<!--
输出结果:
Study  at 100
------------------------
array(14) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(0) {
  }
  ["_COOKIE"]=>
  array(0) {
  }
  ["_FILES"]=>
  array(0) {
  }
  ["argv"]=>
  array(2) {
    [0]=>
    string(18) "/usercode/file.php"
    [1]=>
    string(1) "-"
  }
  ["argc"]=>
  int(2)
  ["_SERVER"]=>
  array(17) {
    ["HOSTNAME"]=>
    string(12) "2753e92c701c"
    ["TERM"]=>
    string(5) "xterm"
    ["PATH"]=>
    string(60) "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ["PWD"]=>
    string(1) "/"
    ["NODE_PATH"]=>
    string(27) "/usr/local/lib/node_modules"
    ["SHLVL"]=>
    string(1) "1"
    ["HOME"]=>
    string(5) "/root"
    ["_"]=>
    string(12) "/usr/bin/php"
    ["PHP_SELF"]=>
    string(18) "/usercode/file.php"
    ["SCRIPT_NAME"]=>
    string(18) "/usercode/file.php"
    ["SCRIPT_FILENAME"]=>
    string(18) "/usercode/file.php"
    ["PATH_TRANSLATED"]=>
    string(18) "/usercode/file.php"
    ["DOCUMENT_ROOT"]=>
    string(0) ""
    ["REQUEST_TIME_FLOAT"]=>
    float(1518580241.454)
    ["REQUEST_TIME"]=>
    int(1518580241)
    ["argv"]=>
    array(2) {
      [0]=>
      string(18) "/usercode/file.php"
      [1]=>
      string(1) "-"
    }
    ["argc"]=>
    int(2)
  }
  ["_REQUEST"]=>
  array(0) {
  }
  ["GLOBALS"]=>
  *RECURSION*
  ["name"]=>
  NULL
  ["name2"]=>
  NULL
  ["x"]=>
  int(75)
  ["y"]=>
  int(25)
  ["z"]=>
  int(100)
}
-->



----------------------------------------------------
在 PHP 中,提供了超过 1000 个内建的函数。
http://www.runoob.com/php/php-functions.html
PHP 函数准则:
函数的名称应该提示出它的功能
函数名称以字母或下划线开头(不能以数字开头)


<!--test8.php-->
<!DOCTYPE html>
<html>
<body>

<?php
function writeName()  // 不带参数
{
    echo "Zukgit";
}

echo "My name is ";
writeName();

echo '<br>';


function writeName1($fname)   // 带参数
{
    echo $fname . " Happy new Year.<br>";
}

echo "My name is ";
writeName1("Zukgit");




function add($x,$y)
{
    $total=$x+$y;
    return $total;   // 带返回值的参数
}

echo "1 + 16 = " . add(1,16);
?>

</body>
</html>

<!--
输出结果:
My name is Zukgit
My name is Zukgit Happy new Year.
1 + 16 = 17

-->




----------------------------------------------------
PHP 向它运行的任何脚本提供了大量的预定义常量。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
__LINE__      文件中的当前行号
__FILE__      文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__       文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FUNCTION__   函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写
_CLASS__      类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
__TRAIT__    Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
__METHOD__   类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__  当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)




<!--test9.php-->
<!DOCTYPE html>
<html>
<body>

<?php

echo '这是第 " '  . __LINE__ . ' " 行';
echo '<br>';
echo '这是第 " '  . __LINE__ . ' " 行';
echo '<br>';
echo '这是第 " '  . __LINE__ . ' " 行';


echo '该文件位于 " '  . __FILE__ . ' " ';
echo '<br>';
echo '该文件目录位于 " '  . __DIR__ . ' " ';
echo '<br>';
function test() {
    echo  '被调用函数名为:' . __FUNCTION__ ;
}

test();

echo '<br>';



class obj1 {
    function _print() {
        echo '类名为:'  . __CLASS__ . "<br>";
        echo  '函数名为:' . __FUNCTION__ ;
    }
}

$mObject= new obj1();
$mObject->_print();



echo '命名空间为:"', __NAMESPACE__, '"'; 
?>

</body>
</html>


<!--
输出结果:

这是第 " 8 " 行
这是第 " 10 " 行
这是第 " 12 " 行该文件位于 " /usercode/file.php " 
该文件目录位于 " /usercode " 
被调用函数名为:test
类名为:obj1
函数名为:_print命名空间为:""


-->

----------------------------------------------------
在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:
1、使用use操作符导入/使用别名
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use \ArrayObject;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象


2、 一行中包含多个use语句
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func

3、导入和动态名称
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象

4、导入和完全限定名称
use My\Full\Classname as Another, My\Full\NSname;



----------------------------------------------------
面向对象内容
http://www.runoob.com/php/php-oop.html

类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象 − 是类的实例。
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
成员函数 − 定义在类的内部,可用于访问对象的数据。
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类 − 一个类继承其他类称为子类,也可称为派生类。
多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。


PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,
总与new运算符一起使用在创建对象的语句中。

function __construct( $par1, $par2 ) {
   $this->url = $par1;
   $this->title = $par2;
}


PHP 析构函数
   function __destruct() {
       print "销毁 " . $this->name . "\n";
   }

PHP 继承 
   class Child_Site extends Site {

   }


访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。

<!--test11.html>
<html>
<body>

<?php
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public<br>';
    protected $protected = 'Protected<br>';
    private $private = 'Private<br>';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
#echo $obj->protected; // 这行会产生一个致命错误
#echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 可以对 public 和 protected 进行重定义,但 private 而不能
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
#echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined

?>

</body>
</html>


<!--
输出结果:
Public
Public
Protected
Private
Public
Public
Protected2

-->




接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。

<!--test12.php-->
<!DOCTYPE html>
<html>
<body>

<?php

// 声明一个'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getInfo();
}


// 实现接口
class Template implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }

    public function getInfo()
    {
        foreach($this->vars as $name => $value) {
            echo '{' . $name . '}' . "value :" . $value;
            echo '<br>';
        }
    }
}

    $mInterface = new Template();
    $mInterface->setVariable("A","1");
    $mInterface->setVariable("B","2");
    $mInterface->getInfo();
?>
</body>
</html>



<!--
输出结果:
{A}value :1
{B}value :2
-->




----------------------------------------------------
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;
另外,这些方法的访问控制必须和父类中一样(或者更为宽松)

<!--test13.php-->
<!DOCTYPE html>
<html>
<body>

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>
</body>
</html>


<!--
输出结果:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
-->





----------------------------------------------------

Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。



<!--test14.php-->
<!DOCTYPE html>
<html>
<body>

<?php
class Foo {
  public static $my_static = 'foo';

  public function staticValue() {
     return self::$my_static;
  }
}

print Foo::$my_static . PHP_EOL;
$foo = new Foo();

print $foo->staticValue() . PHP_EOL;
?>    
</body>
</html>





<!--
输出结果:
foo
foo
-->




----------------------------------------------------
PHP 不会在子类的构造方法中自动的调用父类的构造方法。
要执行父类的构造方法,需要在子类的构造方法中调用 
parent::__construct() 。


<!--test15.php-->
<!DOCTYPE html>
<html>
<body>

<?php
class BaseClass {
   function __construct() {
       print "BaseClass 类中构造方法" . PHP_EOL;
   }
}
class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();  // 子类构造方法不能自动调用父类的构造方法
       print "SubClass 类中构造方法" . PHP_EOL;
   }
}
class OtherSubClass extends BaseClass {
    // 继承 BaseClass 的构造方法
}

// 调用 BaseClass 构造方法
$obj = new BaseClass();

// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();

// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>
</body>
</html>


<!--
输出结果:
BaseClass 类中构造方法
BaseClass 类中构造方法
SubClass 类中构造方法
BaseClass 类中构造方法

-->


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值