今天被问到一些PHP的基础问题一下子被问住了。。唉,人老了很多基础都忘了

来源:互联网 发布:coursera python 课程 编辑:程序博客网 时间:2024/04/30 03:36

今天,很不幸的是,和一个同行交流的时候,被他用基础的PHP的问题给问住了,虽然很不甘心,但是又无可奈何,最后我只能说,不好意思。这些你问的东西,我在实际应用中不怎么用到,很多都已经生疏了,真的要问,那我只能重新翻阅资料来做出解答或是使用。


虽然这么说了,但是心里异常的窝火,感觉很难受。回来以后把这些内容都整理一下吧。

第一个是require和include

将PHP代码包含进文件,我一般只能include_once。确保只将文件引入一次,但是我在回答的时候我只是说了require,之后被问及为什么不用require_once,我说只是说法上的不同,我一般都是用_once的。

这里我有没考虑到的几个点。

他说的也有问题,什么叫为什么不用require_once,其实require加载的速度更快,为因用require_once的时候他会做检查的。如果看重效率的话,用require的话会更好些。不过大多数情况下用require_once吧。

而require和include的区别就是函数加载失败后的处理。

require直接异常错误中断了,include是仍然会执行,只是给一个警告提示。

在这里的话我感觉实际操作中并没有太多一定要讲究的地方,四种方式都可以接受,按自己的喜爱和习惯就行了。

所以我用include_once用得多些。至于错误和警告,则交由php的配置去处理了。可能require_once在加载错误后直接中断会更符合开发吧。

加载文件还有一个方法,是在php.ini的配置里定义,有两个参数
auto_prepend_file和auto_append_file

具体的用法就不说了,因为这是要写在配置(.ini)里面的,所以我不会考虑用这种方式,以后代码的维护和部署会相当困难。

之后又问到了关于魔术函数的内容。

一时间我也忘了,只是后来提醒了一下我才想到是PHP5里面内定的凡是函数前面加__的就是魔术函数。

比如__autoload,就是自动加载文件到程序中。然后问我除了这个__autoload以外还有什么别的方法实现自己加载的?

我答不上来,我只是在当时说了,1、我自己控制好,不会让两个同名不同目录的文件出现。2、我会尽量不用这个方法,我也觉得这个方法并不是必须的。
一般__autoload我只会用在MVC中要匹配的M和C的对应关系中,其它的我会考虑手动加载。

比如在control层中我定义了一个叫test.php的文件,然后在Modle层里会有对应的test.class.php文件,那我是用autoload来控制的,而且如果有特别的情况时,我会在autoload通过添加逻辑控制的代码来做一些区别和筛选(当然,这点我当时忘了,没有讲到)

至于还有没有别的方法,我不知道。真不知道,开发中可能会有吧。后来查了一下资料有一个叫spl_autoload_register的方法,我查了一下,这个方法确实对加载文件有很不错的效果,值得一用。不过我目前因为在应用中没有碰到需要用到的地方,或者说有问题的地方我都已经以其它方式处理掉了,所以也没有看过这个东西的用法。

除此之外的魔术函术还有很多。比如说__construct和__destruct

啊……我弱比了,这就是java里面的构造函数吧。不过PHP里也能通过直接命名与类名一样名字的方法来达到效果的。
__destruct是析构,JAVA里没有,C++的东西。

可能太紧张了,一时间我没想到。

还有__call,__get,__set,__toString,__clone,__sleep
这些都是魔术函数,__clone么就是Java里也有的。

啊哈哈……好吧,我承认这些我一直都没怎么用过。__get,__set我都是手动去实现他们的方法的。

所以……果断我没答出来了。-____-

最后又问到一个面向对向的问题,好像说是定义一个类,将这个类传到一个方法里面去,然后在这个方法里改变这个类的变量,之后在外部类里这个变量会不会变。。

当时我前面已经被问傻了,这个问题我随便答了一下。。貌似说错了。

事后冷静地回想一下,应该是传的引用吧,好像当时我说错了,主要是那时候已经被问的混乱了。

算了,最后用一段TEST代码结束这篇文章吧
<? Class Test{  function __construct(){   echo "construct start<br>";  }  function setName($name){   $this->name = $name;  }  function getName(){   return $this->name;  } } $test = new Test(); $test->setName("daibi"); $name = $test->getName(); echo $name."<br>"; function difTest($t){  $t->setName("shabi");  $name = $t->getName();  echo $name."<br>"; } difTest($test); $name = $test->getName(); echo $name."<br>";


输出结果:

construct start
daibi
shabi
shabi

0 0
原创粉丝点击