Java程序员学习维护php项目笔记

最近公司很久以前的一个php的项目因为之前设计缺陷,缺少了修改密码的功能,然而,现在又没有PHP程序员,只能让我们来尝试着去做一下。刚听到说要去改PHP项目时,一脸的迷茫,然后就各种查看资料。没想到只花了三天的时间,就把PHP的运行,项目框架以及代码编写了解了,并完成了功能的开发。好了,闲话不多说了,现在就简单的谈一下一个java程序员去修改PHP项目的过程吧。
刚拿到项目的时候,首先肯定是要把项目给跑起来。对于新手来说自己安装运行环境是比较困难的,需要去安装配置Apache,MySQL等,但一般都有集成的环境,我直接使用了wamp(Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python)server ,安装只要按照提示就行了。安装完之后,把项目拷贝到wamp的www文件夹下,如图项目路径。然后就可以启动wamp了,启动好之后,如图wamp启动我的项目位置可以看到自己的项目。我们那个项目使用的是ThinkPHP框架,在服务启动后,打开访问127.0.0.1可以在your projects里面看到自己的项目。然后,查找了一下访问项目中页面的方法,对比了好久之后,发现我的只能通过带单入口index.php然后跟上/action名/方法名或者m=action名&a=方法名的方式才能访问,而用我们正式运行环境给的路径访问时就会报找不到页面文件的错误,并且按之前的方法,登录页面验证码出不来并且,输入用户名和密码后以及随便写个验证码后,又会报其他页面找不到的错误。后来,查了好久资料后,才知道原来为了优化SEO,一般都会要配置把index.php从访问路径中去掉。而项目里面已经设置了去掉的风格,但wamp里面却没有设置。所以,需要找到wamp的Apache根目录conf文件夹下的httpd.conf配置文件,打开 mod_rewrite.so模块 打开mod_rewrite.so,并查找文件中所有的AllowOverride None,将None改为All。另外,数据库配置忘说了,一般在项目的conf文件夹下的config.php文件,为了修改方便,可能会抽取出来再引入到conf.php中。既然说到这块了,我就在说一下我理解的项目的大概结构。在这个项目中,主要用到了common,conf,core,lib,public,tpl这几个文件夹项目结构。其中common是放自己写的通用的函数,conf是放置配置文件的,core是框架的东西,lib放置action,public放一些公用的如css,images,js等静态文件,tpl放置页面的文件。另外,runtime是运行的文件,感觉就是java的编译文件。通过项目的结构就感觉,比java的框架要简洁得多,也很容易理解。并且,写代码时,基本上只用在lib中写自己的action,在tpl写页面。而不用像java中如SSM框架分为页面,action,service,dao,xml,model并且有些框架还细分接口和实现,对于小的项目操作起来就感觉操作太多了。
接下来,就说一下我整理的一些语法的差异,主要有以下:
.表示字符串相加
->同Java中的.
PHP调用父类的构造函数不是使用super(),而是parent::__construct()。
PHP使用this表示当对象,这点同Java的this
PHP使用parent表示父类,这点同Java的super
PHP使用self表示当前类,Java没有这个关键字,也不需要使用表示类。
PHP在调用本类中的静态变量和方法时,必须使用self关键字和::,示例代码:
class A(){
public static function foo () {echo “foo”;}
self :: foo ();
}
如果不在本类中则直接使用类名:
class A(){
public static function foo () {echo “foo”;}
}
A :: foo ();

php脚本的后面名为.php,代码放置在下面的括号里面:
<?php
.......
?>

echo可以打印信息,类似于printf。
<?php
echo "hallo world";
?>
每条语句后面用分号结尾;。

php支持三种注释方式:
1<?php
// 第一种

 #第二种

/*
这是
多行
注释
*/
?>

在php中,函数、类、和关键词的大小写都是同一个东西:
<!DOCTYPE html>
<html>
<body>

<?php
ECHO "Hello World!<br>";
echo "Hello World!<br>";
EcHo "Hello World!<br>";
?>

</body>
</html>
不过所有变量都对大小写敏感,需要区分大小写。
<?php
$color="red";
$Color="black";
echo "my car is " . $color . "<br>";
echo "my car is " . $Color . "<br>";
?>
上面的例子同时指出了变量定义以及字符串拼接的语法。

变量命名规则:
PHP 变量规则:
  ● 变量以 $ 符号开头,其后是变量的名称
  ● 变量名称必须以字母或下划线开头
  ● 变量名称不能以数字开头
  ● 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
  ● 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
  ● 变量会在第一次赋值时被创建。无需声明变量的类型。


变量会有三种不同的作用域:
PHP 有三种不同的变量作用域:
  1. local(局部)
  2. global(全局)
  3. static(静态)
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
下面的例子测试了带有局部和全局作用域的变量:
<?php
$x=5; // 全局作用域

function myTest() {
 $y=10; // 局部作用域
 echo "<p>测试函数内部的变量:</p>";
 echo "变量 x 是:$x";
 echo "<br>";
 echo "变量 y 是:$y";
} 

myTest();

echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
运行结果:
测试函数内部的变量:
变量 x 是:
变量 y 是:10
测试函数之外的变量:
变量 x 是:5
变量 y 是:
比较奇怪的就是为什么全局变量不能在局部函数内访问。
其实可以访问,不过需要global关键字的帮助:
global 关键词用于访问函数内的全局变量。
要做到这一点,请在(函数内部)变量前面使用 global 关键词:
<?php
$x=5;
$y=10;

function myTest() {
 global $x,$y;
 $y=$x+$y;
}

myTest();
echo $y; // 输出 15
?>
PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
<?php
$x=5;
$y=10;

function myTest() {
 $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 

myTest();
echo $y; // 输出 15
?>
通常,当函数完成执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。实现这一点需要static:
<?php

function myTest() {
 static $x=0;
 echo $x;
 $x++;
}

myTest();
myTest();
myTest();

?>

php中echo和print都能使用,两者的唯一区别是print返回1,echo没有返回值。

strlen函数可以返回字符串的长度。

strpos函数用来确定另外一个字符串的位置:
<?php
echo strpos("Hello world!","world");
?>

使用define函数来定义常量:
<?php
define("GREETING", "Welcome to W3School.com.cn!");
echo GREETING;
?>
define函数还有第三个参数,用来指定是否大小写敏感。

php的if-else语句和其他语言大同小异,举个例子:
<?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!";
}
?>

switch-case语句:
<?php
switch ($x)
{
case 1:
 echo "Number 1";
 break;
case 2:
 echo "Number 2";
 break;
case 3:
 echo "Number 3";
 break;
default:
 echo "No number between 1 and 3";
}
?>

while、for语句和其他语言无差别,看看foreach吧:
<?php 
$colors = array("red","green","blue","yellow"); 

foreach ($colors as $value) {
 echo "$value <br>";
}
?>

php的真正力量来自于它的函数,它有1000个内置函数。
用户定义的函数声明以单词 "function" 开头:
function functionName() {
  被执行的代码;
}
举个例子:
<?php
function writeMsg() {
 echo "Hello world!";
}

writeMsg(); // 调用函数
?>

// 含参数
<?php
function familyName($fname,$year) {
 echo "$fname Zhang. Born in $year <br>";
}

familyName("Li","1975");
familyName("Hong","1978");
familyName("Tao","1983");
?>

// 默认参数
<?php
function setHeight($minheight=50) {
 echo "The height is : $minheight <br>";
}

setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>

// 返回值
<?php
function sum($x,$y) {
 $z=$x+$y;
 return $z;
}

echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

在 PHP 中,有三种数组类型:
  1. 索引数组 - 带有数字索引的数组
  2. 关联数组 - 带有指定键的数组
  3. 多维数组 - 包含一个或多个数组的数组
索引数组:
$cars=array("Volvo","BMW","SAAB");
<?php
$cars=array("Volvo","BMW","SAAB");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

// count
<?php
$cars=array("Volvo","BMW","SAAB");
echo count($cars);
?>

// 变量索引数组
<?php
$cars=array("Volvo","BMW","SAAB");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) {
 echo $cars[$x];
 echo "<br>";
}
?>
关联数组:
1$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
或
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";

<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>

// 遍历
<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
foreach($age as $x=>$x_value) {
 echo "Key=" . $x . ", Value=" . $x_value;
 echo "<br>";
}
?>

数组排序方法有下面这些:
  ● sort() - 以升序对数组排序
  ● rsort() - 以降序对数组排序
  ● asort() - 根据值,以升序对关联数组进行排序
  ● ksort() - 根据键,以升序对关联数组进行排序
  ● arsort() - 根据值,以降序对关联数组进行排序
  ● krsort() - 根据键,以降序对关联数组进行排序
比较难理解的是键值对排序。
<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
asort($age);
?>

<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
ksort($age);
?>

超全局变量,也就是预定义的全局变量,在哪里都能用,有特殊含义:
  ● $GLOBALS:引用全局作用域中可用的全部变量
  ● $_SERVER:保存关于报头、路径和脚本位置的信息。
  ● $_REQUEST:用于收集 HTML 表单提交的数据。
  ● $_POST:用于收集提交 method="post" 的 HTML 表单后的表单数据。也常用于传递变量。
  ● $_GET:$_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。
  ● $_FILES
  ● $_ENV
  ● $_COOKIE
  ● $_SESSION
其他内容可以在表单处理中找到。

unset() 函数释放指定的变量
isset()函数检测变量是否设置
empty()函数检查一个变量是否为空,为空或者无变量的则为真.

php是一种弱类型检查的语言,和其他语言不同的是,变量或常亮的数据类型由程序的上下文决定。在强类型语言中,变量要先指定类型,然后才可以存储对应指定类型的数据。而PHP等弱类型语言中,变量的类型是由存储的数据决定的。

可使用函数var_dump()来查看某个表达式的值和类型

PHP不会解析单引号中的变量,而是讲变量原样输出,所以在定义简单字符串时,使用单引号时效率会更高,因为PHP解析时不会花费一些处理字符转义和解析变量上的开销。

双引号会解析双引号中的包含变量
$hi='nihao';
echo "this is a ${one}s";
echo "this is a {$one}s";
如果是复杂的语法,可以用花括号括起一个表达式.

在php中是通过define()函数来定义常量的,其命名规格与变量相似,常量默认为大小写敏感,按照惯例常量标识符总是大写的,但是不要再常量前面加上”$”符号.
define()函数的第一个参数为常量名,第二个参数为常量的值或是表达式,第三个参数是可选的,若把第三个参数设为TRUE,则常量将会定义成不区分大小写.
define(“HI”,150,true);
echo HI;
echo hi;
使用defined()函数,检查常量是否存在,如果存在则数据常量的值.
常量能表示的值的类型,只能是数值(整型,浮点型),字符型,布尔型,NULL,常量的值不能是数据,对象,资源.
常量一旦定义不允许修改,不能删除.

另外,虽然只是一个修改密码的功能,在编写的过程中,还遇到了权限控制的问题,可能是写这个项目的人没有处理好吧。在这个项目中,把需要权限校验的action都继承一个带有方法校验的基类。而不需要权限校验的直接继承Action,对比起java的权限管理,感觉有些不太合理,可能是没有太理解吧。还有,例如菜单什么的一般都会放到缓存中,直接先去读缓存文件,如果配置菜单对缓存文件进行处理,还得主要清理缓存文件。

在这几天的学习,最大的感受是用PHP做小项目真的是太方便了,可能是因为我们那个项目比较小,没有了解做大项目的框架吧。另外,在编码的过程中,基本上都是在调用各种函数,比如java中传参数可能直接就在括号里面用实体或者参数名接收了或者是在域中获取,但在这个项目的页面和action交互的接口中,所有的参数都是直接通过函数获取的。并且,只要开启了debug模式,不管修改,添加什么文件都是直接生效的,不用像java还要经常的重启服务,并且时间还比较长。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值