全ての定義済の変数を配列で返す

全ての定義済の変数を配列で返す関数です。
全てなのでとってきて欲しくないものまでも取ってきます。
なのでそういうのはunsetします。
ちなみに似たようなのでcompactという関数がPHPには存在します。

何に使用する場合に便利かは人それぞれ違いますが
自分の場合はテンプレートエンジンを使用するときに重宝してます。
テンプレートエンジン・・・TwigやSmartyなど

<?php

$a = "abc";
$b = array(1,2,3);
$c = 123;

$vars = get_defined_vars();
unset($_COOKIE);
unset($_POST);
unset($_GET);
unset($_FILES);
unset($GLOBALS);
foreach ($vars as $key => $value) {
    var_dump($key);
    var_dump($value);
}
//...
var_dump($vars);

 

ネームスペースの利点はこれだと思っている。

ネームスペースの利点はこれだと思っている。
複数人で開発とかしているときに関数名やクラスなどが
かぶってしまう可能性ある、そういうのを
解決してくれるのがネームスペースということです。

<?php
namespace test\demo;

class test{
    function demo():string
    {
        return "demo1\n";
    }
}

namespace test\demo2;
 
class test{
    function demo():string
    {
        return "demo2\n"; 
    }
  }

 

<?php
include_once "./index-6.php";

$demo = new  test\demo\test();
print $demo->demo();
$demo = new  test\demo2\test();
print $demo->demo();

PHP忘れてしまいそう。

こういう書き方とか書かなかったら忘れてしまいそうですね。
クラスの多重継承とか職場ではそもそもしない。Functionで十分な感じで
この頃、ろくなコードを書いていません。FunctionからFunctionへなんて
コードを書いてたりしています。

 

<?php

function demo1(int $val=0):int
{
    return 3 * 3 * $val;
}

print demo1(3);


class demo2
{
    public static function test1():string
    {
        return "ABC";
    }
}

$demo2  = "demo2";
print $demo2::test1();


trait demo3
{
    public static function test2($val=""){
        return $val;
    }
    
}

class demo4 
{
    public static function test3($val = "")
    {
        return $val;
    }
}

class demo5 extends demo4
{
    use demo3;
    public static function test4($val = "")
    {
        return $val;
    }
}

$demo5 = 'demo5';
print $demo5::test2(1);
print $demo5::test3(2);
print $demo5::test4(3);

PHPでバインドするこれでSQLの脆弱性が!?

上記の画像では脆弱性がある。

PHPでバインドするこれでSQLの脆弱性が解決してくれる?
こういう記述すると良さげ。
おまけでSQLデバッグ方法を書いとります。

<?php
$sql =<<<SQL
select * from demo where id = :id and namae = :hoge;
SQL;
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$id = 123;
$hoge = "hoge";
$sth = $dbh->prepare($sql);
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->bindValue(':hoge', $hoge, PDO::PARAM_STR);
$sth->execute();

//mysql log?https://github.com/panique/pdo-debug:$sth->debugDumpParams();

$fval = array(
    ':id'=>1,
    ':name'=>"hoge"
);
$sth = $dbh->prepare($sql);
$sth->execute($fval);
print PdoDebugger::show($sql, $fval);
$sth->debugDumpParams();

WordPressの全記事の中からランダムで記事をピックアップしてツイートする。

WordPressの全記事の中からランダムで記事をピックアップしてツイートする。
実際、自分の階層に合わして呼び出しを変更してください。
なお、さくらレンタルサーバーでクロンの設定をして自動投稿できます。
ライブラリの設置などは割愛してます。

<?php
// cron:: cd /home/user/www/zip358.com/site/tw; /usr/local/bin/php tw.php

require_once ('../../wp-load.php');
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

$consumer_key = "XXXXXXXXXXXXXX";
$consumer_secret = "XXXXXXXXXXXX";
$access_token = "XXXXXXXXXXXXXX";
$access_token_secret = "XXXXXXXXXXXXXXX";

$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);



$args = array(
	'posts_per_page' => 1,
    'orderby' => 'rand'
);

$posts = get_posts($args);
foreach ( $posts as $val ){
    $href =  get_permalink($val->ID);
    $title = get_the_title($val->ID);
    $res = $to->post("statuses/update", array("status" => $title . " " . $href));
}

PHPのインターフェイスとやら簡単に言えば。

インターフェイスとはなんぞや?
簡単に言えばこのメソッド名は必ず使えです。
無ければエラーになります。
大規模な開発から中規模な開発時には一応必要かな?

 

<?php
interface  test1{
    public function test_11(int $val=1);
    public function test_12(string $val="000");
}



class demo implements test1{

    public function demo1(int $val=0){
        return $this->test_11($val);
    }

    public function test_11(int $val=1){
        return $val;
    }
    public function test_12(string $val=""){
        return $val;
    }    
}


$demo = new demo();
print $demo->demo1(111);

 

PHPで怒られる怒られない。

PHPで怒られる書き方と怒られない書き方です。
下記のコードを参照ください。

<?php

class demo_php1{

    function demo1($val=""){
        return $val;
    }

    public function demo2($val=""){
        return $val;
    }

    static function demo3($val=""){
        return $val;
    }
}

print demo_php1::demo1("DEMO1\n");
print demo_php1::demo2("DEMO2\n");
print demo_php1::demo3("DEMO3\n");

下記のようにインスタンス(instance)すればこのコードはすべて怒られないです
それだけの違い。ちなみにdemo3は怒られない書き方です。

オブジェクトを単体で使う場合は気をつけましょう。
PHPのバージョンアップするにつれjavaのような動きになってきています。
PHP、Pythonに負けないようにかこの頃開発が活発化してます。
最新はPHP7.4ですからね・・・。

$demo_php1 = new demo_php1();
print $demo_php1->demo1("DEMO1\n");
print $demo_php1->demo2("DEMO2\n");
print $demo_php1->demo3("DEMO3\n");

WordPress自動日本語タグを吐き出しプラグインを作りました。

WordPress自動日本語タグを吐き出しプラグインを作りました。
あのjapanese autotagというプラグインと考え方は同じですが、
自分が作ったものはその簡略化したものです。

ソースコードは全ったく違う感じですが、動作は似たような感じです。
機能はjapanese autotagよりかは少ないですが、これだけで十分かなと思います。

ダウンロードはこちらから
https://zip358.com/tool/jp-auto-tag.zip

尚、Yahoo デベロッパーのアプリケーションIDが必要となります。

ソースコードは下記になります。

<?php
/*
Plugin Name: jp-auto-tag
Version: 0.1.11
Description: auto jp tag
Author: taoka toshiaki
Author URI: https://zip358.com/
Plugin URI: https://wordpress.org/extend/plugins/jp-auto-tag/
*/

class jp_auto_tag{
    
    public $db_option = "jp_auto_tag";
    //api
    public $results = "ma";
    public $filter = array("1","2","3","4","5","6","7","8","9","10","11","12","13");

    function frm_page(){
        add_menu_page('jp-auto-tag','jp-auto-tag',  'manage_options', __FILE__, array($this,'show_text_option_page'), '',8);
    }
    
    function show_text_option_page(){
        wp_enqueue_style( 'bootstrap', 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css', array(), '3.3.6' );
        wp_enqueue_script( 'bootstrap', 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js', array(), '3.3.6'); 
        
        $options = get_option($this->db_option);
        if(!empty($options)){
            $appid = $options["appid"];
            foreach ($this->filter as $key => $value) {
               if($options["filter".$value] == $value){ 
                    $f[] = "checked";
               }else{
                   $f[] = "";
               }
            }
        }
        include_once dirname( __FILE__ ).'/jp-auto-tag-tmp.php';
    }
    
    function ajax_event(){
        
        $appid = $_POST["appid"];
        $filter =$_POST["filter"];
        
        $options["appid"] = $appid;
        
        foreach ($this->filter as $key => $value) {
            if(in_array($value,$filter,true)){
                $options["filter".$value] = $value;
            }else{
                $options["filter".$value] = "";
            }
        }
        
        update_option($this->db_option, $options);
        
        
        $obj["appid"] = $appid;
        $obj["filter"] = $filter;
        
        
        print json_encode($obj);
        die(0);
    }
    
    
    function api_tag($post_id){
ini_set("display_errors",1);
        $post = get_post($post_id);
        $title = $post->post_title;
        $content = strip_tags($post->post_content);
        $sentence = $title.$content;
        if(strlen($sentence)>102400){
            $sentence = substr($sentence,0,102400);
        }
        
        $options = get_option($this->db_option);
        if(!empty($options)){
            $appid = $options["appid"];
            foreach ($this->filter as $key => $value) {
               if($options["filter".$value] == $value){ 
                    $f[] = $value;
               }
            }
        }        

        if($appid){
            $filter = implode("|",$f);
            if(!$filter){
                $url = "https://jlp.yahooapis.jp/MAService/V1/parse?appid=$appid&results=$this->results&sentence=".urlencode($sentence);
            }else{
                $url = "https://jlp.yahooapis.jp/MAService/V1/parse?appid=$appid&results=$this->results&ma_filter=$filter&sentence=".urlencode($sentence);
            }

            $xml = @file_get_contents($url);
            $xml_obj = simplexml_load_string($xml);  
            if($xml_obj->ma_result->word_list){
                foreach($xml_obj->ma_result->word_list->word as $word) {
                    if($word->surface){    
                        $tags[] = $word->surface;
                    }
                    if(is_array($tags)){
                        wp_set_post_tags($post_id, implode(",",array_unique($tags)), false);
                    }
                }
            }
        }
       
    }
    
}

$jp_auto_tag = new jp_auto_tag();

add_action('save_post',array($jp_auto_tag,'api_tag'));
add_action('publish_post',array($jp_auto_tag,'api_tag'));
add_action('admin_menu', array($jp_auto_tag, 'frm_page'));
add_action('wp_ajax_ajax_event',array($jp_auto_tag,'ajax_event'));
<form id="ajax-frm">
<table class="table">
    <tr>
        <td>
            アプリケーションID
        </td>
        <td>
            <input type="text" name="appid" value="<?=$appid?>" class="form-control">
        </td>
    </tr>
    <tr>
        <td>
            解析結果として出力する品詞
        </td>
        <td>
            <input type="checkbox" name="filter[]" value="1" <?=$f[0]?>  class="form-control">1 : 形容詞
            <input type="checkbox" name="filter[]" value="2" <?=$f[1]?> class="form-control">2 : 形容動詞
            <input type="checkbox" name="filter[]" value="3" <?=$f[2]?> class="form-control">3 : 感動詞
            <input type="checkbox" name="filter[]" value="4" <?=$f[3]?> class="form-control">4 : 副詞
            <input type="checkbox" name="filter[]" value="5" <?=$f[4]?> class="form-control">5 : 連体詞
            <input type="checkbox" name="filter[]" value="6" <?=$f[5]?> class="form-control">6 : 接続詞
            <input type="checkbox" name="filter[]" value="7" <?=$f[6]?> class="form-control">7 : 接頭辞
            <input type="checkbox" name="filter[]" value="8" <?=$f[7]?> class="form-control">8 : 接尾辞
            <input type="checkbox" name="filter[]" value="9" <?=$f[8]?> class="form-control">9 : 名詞
            <input type="checkbox" name="filter[]" value="10"<?=$f[9]?>  class="form-control">10 : 動詞
            <input type="checkbox" name="filter[]" value="11"<?=$f[10]?>  class="form-control">11 : 助詞
            <input type="checkbox" name="filter[]" value="12"<?=$f[11]?>  class="form-control">12 : 助動詞
            <input type="checkbox" name="filter[]" value="13"<?=$f[12]?>  class="form-control">13 : 特殊(句読点、カッコ、記号など)
        </td>
    </tr>
    <tr>
        <td colspan="2"><input type="button" id="frmsubmit" value="登録する" class="form-control"></td>
    </tr>
</table>    
</form>
<script>
    jQuery(function($){
        $("#frmsubmit").on("click",function(){
            var ajaxurl = '<?=admin_url( 'admin-ajax.php');?>';
            var data = $("#ajax-frm").serializeArray();
            data.push({name:"action",value:"ajax_event"});
            $.ajax({
               type:'POST',
               url:ajaxurl,
               data:data,
               success:function(obj){
                   console.log(obj);
                   if(obj.appid!==""){
                       alert("更新しました");
                   }
               }
            });
            
        });
    })
</script>