nimGame

21 Oct 2015 Category: 题趣

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.

Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.

For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.

以上是leetcode中的一道编程题目。实在惭愧,弄了半天没明白,最后发现题目关键是4 个的时候第一个人必定无法赢。一下是解题:


<?php
/**
 * nimGame,给定石头数目,每次只能从中拿1到3个石头。
 * 思路:
 * 每次开始拿的时候,如果石头的数目是4个,则开始拿的人则输。
 * 因此判断第一个人是一定能赢就是判断石头数目是否是4的整数倍。
 * 保证每次必定赢的策略是留给下个人4的整数个。比如他拿k个,自己就拿4-k个
 * @param  int $number strone of number
 * @return boolean          if the firster can win
 */
function nimGame( $number )
{
    if( $number%4 != 0 )
    {
        return 1;
    }
    else
        return 2;
}
?>

查看更多

Yii2 主题记录

15 Oct 2015 Category: PHP

Yii2本身支持多模块,多主题开发。因此对开发中遇到的多主题问题,以及自定 义不同模块主题需要的注意事项进行记录

  • 主题添加

默认全局主题在配置文件中添加comment配置


 'view' => [
            'theme' => [
                'basePath' => '@app/themes/{themesName}',
                'baseUrl' => '@web',
                'pathMap' => [
                    '@app/views' => '@app/themes/{themesName}',
                ],
            ],
  ]

  • 多模块定义主题

如果有多个不同的模块,想要在不同的模块中设置不同的模板,在模块的入口文 件中添加


        \Yii::$app->view->theme = new \yii\base\Theme([
            'pathMap' => ['@app/views' => '@app/admin/views'],
            'baseUrl' => '@web',
        ]);

  • 文件机制

YII2中主题layout文件机制,如果定义了重新定义了@app/views,则在该目录下搜 索layout文件夹中的布局文件,如果没有,则在默认文件中寻找。其他页面的view 文件也是如此。

  • 注意

如果你跟我一样,将themes文件放置在app根目录内,而网站更目录是@app/web,那 么还需要对主题的静态文件做稍微修改。 YII2中,web可以访问的目录是限制在@web目录下。所以以上情况需要将主题的静态 文件使用Assets发布。

比如主题的路径@app/themes/tfviolet,在该目录下(该目录下其他目录内也可以)建 立一个ThemeAsset文件


namespace app\themes\tfviolet;

use yii\web\AssetBundle;

class ThemeAsset extends AssetBundle
{
    public $sourcePath = '@app/themes/tfviolet/static';
    public $css = [

        'css/materialize.min.css',
        'css/style.css'
    ];

    public $js = [
        'js/materialize.min.js'
    ];
}

注意,一定要定义sourcePath,只有这样才能将sourcePath的所有文件发布到asset目 录下。发布的目录是@basthPath/asset 定义sourcePath之后,该Assets的baseUrl, basePath则是无效的,被AssetManage覆盖。

查看更多

Yii2 SQL查询语句

15 Oct 2015 Category: PHP

Yii2对于数据库操作好多都是通过ActiveRecord进行。但是ActiveRecord提供的一些 接口都是进行比较简单的查询。如果进行一些复杂的查询,查询语句的构建就比较麻烦。 对于自己所想到的sql查询语句创建进行记录。

  • A and (B or C) 期望
sql = "SELECT * FROM `table` where `name` like %xiaoming%
       and ( `last_ip` like %192.168.171%  or `current_ip` like %192.168.171% )";

Yii语句


$query->andFilterWhere(['like','name','xiaoming']);
$query->andWhere([
    'or',
    ['like','last_ip','192.168.171'],
    ['like','current_ip','192.168.171']
]);

注解

andWhere构建查询语句,会根据参数的类型进行解析。第一个参数是第二,第三个参数的连 接符。如果第二第,第三个参数还符合where参数定义,则进行递归解析。

查看更多

PHP static self classname 区别

13 Oct 2015 Category: PHP

PHP中调用静态变量或者静态调用方法在不同的场景中可以使用 className, static, self三种方式调用. 但是这三种方式除了 使用场景上的些许不同还有什么需要注意的呢?前些日志搬砖不 小心踩到一个坑,所以记录一下。

static

PHP中, static 除了在定义的时候作为限制符号对变量已经函数 进行限制,还可以表示当前调用的对象。如果一个对象并没 有集成其他的对象,那么使用static方式调用,和使用self方式 调用是没有区别的,都是指代该对象。但是如果static在代码中 的位置是在一个父类函数中,子类执行该方法的时候,static指 代的是子类,而self指代的是父类。

self

self 调用,主要是在类内部进行使用,指代类本身。

className

以className的方式调用类的静态属性,不仅仅限于类内部,可以在 任何位置(结合属性限制修饰),这也是className方式与其他方式的 主要区别。同时className永远执行className所对应的类本身。

stackoverflow有个问题回答了static,self的区别,链接»

<?php

class Parent_
{
    protected static $x = "parent";
    public static function makeTest()
    {
        echo "self => ".self::$x."<br>";
        echo "static => ".static::$x;
    }
}

class Child_ extends Parent_
{
    protected static $x = "child";
}

echo "<h4>using the Parent_ class</h4>";
Parent_::makeTest();

echo "<br><h4>using the Child_ class</h4>";
Child_::makeTest();
?>

输出结果:

using the Parent_ class

self => parent
static => parent
using the Child_ class

self => parent
static => child

查看更多

PHP call_user_fun 不同版本区别

12 Oct 2015 Category: Developer

PHP中call_user_fun可以调用用户回调函数。但是由于PHP本身的版本, 这个函数在不同的版本上表现还是有区别的,而且这个区别是致命的, 5.4版本下的代码在5.3的版本上直接报错。

先看看一段5.4下正常的代码


<?php

class Api{
    public $onConnect;
    public $onMessage;
    public $name;
    public $data;
    function __construct($name, $data)
    {
        $this->name = $name;
        $this->data = $data;
    }
    public function connect()
    {
        //to connect data
        //onConnect
        if( $this->onConnect )
        {
            call_user_func( $this->onConnect, $this );
        }
    }

}

class Client{
    public $clientName;
    function __construct()
    {

    }

    public function afterGetData()
    {
        var_dump($this->clientName);
        //after get data
    }

    public function getData()
    {
        $api = new Api('client1', 'data1');

        $api->onConnect = function($api)
        {
            $this->clientName = $api->name;
            $this->afterGetData();
            //if I want to do more other thins, and can't get data from api
        };

        $api->onMessage = function($api)
        {
            //get message callback
        };

        $api->connect();
    }

}

$client = new Client();
$client->getData();

?>

这段代码在5.4是完全没问题的,但是在5.3的版本上居然报错,提示错误: Using $this when not in object context,提示错误代码行


$this->clientName = $api->name;
$this->afterGetData();

在这里,在回调函数中调用一些当前对象的函数以及使用当前对象的其他属性 是完全有可能的。但是!但是!5.3中不可以。

尝试向js中一样把$this改成$that, 然后发现,在回调函数中,$that指向的是 一个stdClass对象。

所以,一直不知道如何实现这个功能: 在php5.3中的call_user_fun中调用当前对象的一个非静态函数。就是代码中如何 实现调用client对象的afterGetData方式。

查看更多

API Cloud PHP SDK个人版

24 Sep 2015 Category: Developer

因为自己服务器资源有限,所以想要使用apicloud的数据库作为自己项目的存储环境。 由于之前有些混乱事宜,一直搁置。今日稍有点空闲时间,所以重新开始。apicloud的网站上 只有node,python,java,c#的代码,竟然没有php的代码。所以,还得码农亲力亲为。

不得不说,apicloud的restapi做的确实不是很好。删除用户只能登陆用户自己删除,这个 逻辑让我百思不得其姐。什么样的场景下,用户会自己删除自己。

项目中主要内容就是接口调用,没什么值得说的。比较有意思的是将Yii2中的QueryBuilder 方式用于apicloud的查询参数的创建当中。Yii2的QueryBuilder在各个设置函数中都讲本身 对象返回,以实现php对象的连贯操作。同时在QueryBuilder的build函数中,采用递归的方 式构建查询条件。

api cloud php sdk 下载地址

查看更多