Laravel学习笔记之PHP反射(Reflection) (上)

2.1k 次阅读  ·  读完需要 80 分钟

3

说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, method的两个工具包:Introspection FunctionsReflection API,类似于探针一样的东西来探测这些一等公民。本文先看下Introspection Functions的使用。

开发环境: Laravel5.3 + PHP7

Introspection Functions

Introspection Functions是用来操作object class的一些函数,PHP提供了大量的Introspection Functions来操作class, interface, trait, method, property:

  1. class_exists()

  2. interface_exists()

  3. method_exists()

  4. property_exists()

  5. trait_exists()

  6. class_alias()

  7. get_class()

  8. get_parent_class()

  9. get_called_class()

  10. get_class_methods()

  11. get_class_vars()

  12. get_object_vars()

  13. is_subclass_of()

  14. is_a()

class_exists()

Laravel源码中好多个地方使用到class_exists()方法来判断指定类是否存在,如\Illuminate\Database\Connection::isDoctrineAvailable()的源码:

    public function isDoctrineAvailable()
{
return class_exists('Doctrine\DBAL\Connection'); // Doctrine\DBAL\Connection::class类是否存在,大小写不敏感
}

写个PHPUnit测试下(爆绿灯,说明是正确的,这里不截图了。后面所有Introspection的测试都放在IntrospectionTest这个单元测试里):

namespace MyRightCapital\Container\Tests;

class IntrospectionTest extends \PHPUnit_Framework_TestCase
{
public function testClassExists()
{
// Arrange // Actual
$class_exists = class_exists(TestClassExists::class);
// Assert
$this->assertTrue($class_exists);
}
} class TestClassExists
{ }

interface_exists()

interface_exists()是用来检查接口是否存在,写个PHPUnit测试下,爆绿灯:

namespace MyRightCapital\Container\Tests;

class IntrospectionTest extends \PHPUnit_Framework_TestCase
{
public function testInterfaceExists()
{
// Arrange // Actual
$interface_exists = interface_exists(TestInterfaceExists::class);
// Assert
$this->assertTrue($interface_exists);
}
} interface TestInterfaceExists
{ }

method_exists()

检查类的方法(private,protected,public)是否存在于指定的类对象或类名中,Laravel中很多处用到了这个函数,如Application中的register()检查service provider中register是否存在,和bootProvider()中检查service provider中boot()方法是否存在:

public function register($provider, $options = [], $force = false)
{
... if (method_exists($provider, 'register')) {
$provider->register();
} ...
}
protected function bootProvider(ServiceProvider $provider)
{
if (method_exists($provider, 'boot')) {
return $this->call([$provider, 'boot']);
}
}

这里写个PHPUnit测试下,爆绿灯:

    public function testMethodExists()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$object_method_exists1 = method_exists($test_class_exists, 'testPrivateMethodExists');
$object_method_exists2 = method_exists($test_class_exists, 'testProtectedMethodExists');
$object_method_exists3 = method_exists($test_class_exists, 'testPublicMethodExists');
$classname_method_exists1 = method_exists(TestClassExists::class, 'testPrivateMethodExists');
$classname_method_exists2 = method_exists(TestClassExists::class, 'testProtectedMethodExists');
$classname_method_exists3 = method_exists(TestClassExists::class, 'testPublicMethodExists'); // Assert
$this->assertTrue($object_method_exists1);
$this->assertTrue($object_method_exists2);
$this->assertTrue($object_method_exists3);
$this->assertTrue($classname_method_exists1);
$this->assertTrue($classname_method_exists2);
$this->assertTrue($classname_method_exists3);
} class TestClassExists
{
private function testPrivateMethodExists()
{
} protected function testProtectedMethodExists()
{
} public function testPublicMethodExists()
{
}
}

property_exists()

检查该属性(private, protected, public)是否存在于类对象或类名中,Laravel很多地方用到了该函数,如\Illuminate\Foundation\Auth\RedirectsUsers::redirectPath()源码:

    public function redirectPath()
{
return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

写个PHPUnit测试下该函数,爆绿灯:

    // class IntrospectionTest
public function testPropertyExists()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$private_property1 = property_exists($test_class_exists, 'testPrivatePropertyExists');
$private_property2 = property_exists(TestClassExists::class, 'testPrivatePropertyExists');
$protected_property1 = property_exists($test_class_exists, 'testProtectedPropertyExists');
$protected_property2 = property_exists(TestClassExists::class, 'testProtectedPropertyExists');
$public_property1 = property_exists($test_class_exists, 'testPublicPropertyExists');
$public_property2 = property_exists(TestClassExists::class, 'testPublicPropertyExists'); // Assert
$this->assertTrue($private_property1);
$this->assertTrue($private_property2);
$this->assertTrue($protected_property1);
$this->assertTrue($protected_property2);
$this->assertTrue($public_property1);
$this->assertTrue($public_property2);
} class TestClassExists
{
private $testPrivatePropertyExists;
protected $testProtectedPropertyExists;
public $testPublicPropertyExists;
}

trait_exists()

检查trait是否存在,写下PHPUnit测试,爆绿灯:

    // class IntrospectionTest
public function testTraitExists()
{
// Arrange // Actual
$test_trait_exists = trait_exists(TestTraitExists::class); // Assert
$this->assertTrue($test_trait_exists);
} trait TestTraitExists
{ }

class_alias()

给指定类取别名,Laravel中只有一处使用了class_alias(),用来给config/app.php中$aliases[ ]注册别名,可看下Laravel学习笔记之bootstrap源码解析,看下Laravel中如何使用的:

    public function load($alias)
{
if (isset($this->aliases[$alias])) {
return class_alias($this->aliases[$alias], $alias);
}
}

写个PHPUnit测试,爆绿灯:

    public function testClassAlias()
{
// Arrange
class_alias(TestClassExists::class, 'MyRightCapital\Container\Tests\AliasTestClassExists');
$test_class_exists = new TestClassExists(); // Actual
$actual = new AliasTestClassExists(); //Assert
$this->assertInstanceOf(TestClassExists::class, $actual);
$this->assertInstanceOf(AliasTestClassExists::class, $test_class_exists);
}

get_class()

get_class()获取对象的类名,这个函数在Laravel中大量地方在用了,如Application::getProvider($provider)方法,是个很好用的方法:

    public function getProvider($provider)
{
$name = is_string($provider) ? $provider : get_class($provider); return Arr::first($this->serviceProviders, function ($value) use ($name) {
return $value instanceof $name;
});
}

写个PHPUnit测试,爆绿灯:

    public function testGetClass()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$class_name = get_class($test_class_exists); // Assert
$this->assertSame(TestClassExists::class, $class_name);
}

get_parent_class()

get_parent_class()是用来获取类的父类名,目前Laravel中还没用到这个函数,传入的可以是子类对象或者子类名,写个PHPUnit测试下:

    // namespace MyRightCapital\Container\Tests;
// class IntrospectionTest extends \PHPUnit_Framework_TestCase
public function testGetParentClass()
{
// Arrange
$child_class = new ChildClass(); // Actual
$parent_class1 = get_parent_class($child_class);
$parent_class2 = get_parent_class(ChildClass::class); // Assert
$this->assertSame(ParentClass::class, $parent_class1);
$this->assertSame(ParentClass::class, $parent_class2);
} class ChildClass extends ParentClass
{ } class ParentClass
{ }

get_called_class()

get_called_class()获取后期静态绑定类即实际调用类的名称,Laravel中还没使用到该函数,不妨写个测试看下如何使用:

    // namespace MyRightCapital\Container\Tests;
// class IntrospectionTest extends \PHPUnit_Framework_TestCase
public function testGetCalledClass()
{
// Arrange
$child_class = new ChildClass();
$parent_class = new ParentClass(); // Actual
$child_called_class = $child_class->testGetCalledClass();
$parent_called_class = $parent_class->testGetCalledClass(); // Assert
$this->assertSame(ChildClass::class, $child_called_class);
$this->assertSame(ParentClass::class, $parent_called_class);
} class ChildClass extends ParentClass
{ } class ParentClass
{
public function testGetCalledClass()
{
return get_called_class();
}
}

get_class_methods()

get_class_methods()用来获取类的方法名组成一个数组(测试只能是public),Laravel只有一处用到了该方法\Illuminate\Database\Eloquent\Model::cacheMutatedAttributes() :line 3397,这里写个PHPUnit测试,爆绿灯:

    public function testGetClassMethod()
{
// Arrange
$get_class_methods1 = get_class_methods(ChildClass::class);
$get_class_methods2 = get_class_methods(new ChildClass()); // Actual // Assert
$this->assertFalse(in_array('testPrivateGetClassMethod', $get_class_methods1, true));
$this->assertFalse(in_array('testPrivateGetClassMethod', $get_class_methods2, true));
$this->assertFalse(in_array('testProtectedGetClassMethod', $get_class_methods1, true));
$this->assertFalse(in_array('testProtectedGetClassMethod', $get_class_methods2, true));
$this->assertTrue(in_array('testPublicGetClassMethod', $get_class_methods1, true));
$this->assertTrue(in_array('testPublicGetClassMethod', $get_class_methods2, true));
$this->assertTrue(in_array('testGetCalledClass', $get_class_methods1, true));
$this->assertTrue(in_array('testGetCalledClass', $get_class_methods2, true));
} class ChildClass extends ParentClass
{
private function testPrivateGetClassMethod()
{
} protected function testProtectedGetClassMethod()
{
} public function testPublicGetClassMethod()
{
}
}

get_class_vars()

get_class_vars()只会读取类的public属性组成一个数组,类似于get_class_methods(),若属性没有默认值就为null,目前Laravel中还未使用,看下PHPUnit测试:

    public function testGetClassVars()
{
// Arrange // Actual
$class_vars = get_class_vars(ChildClass::class); // Assert
$this->assertArrayNotHasKey('privateNoDefaultVar', $class_vars);
$this->assertArrayNotHasKey('privateDefaultVar', $class_vars);
$this->assertArrayNotHasKey('protectedNoDefaultVar', $class_vars);
$this->assertArrayNotHasKey('protectedDefaultVar', $class_vars);
$this->assertEmpty($class_vars['publicNoDefaultVar']);
$this->assertEquals('public_laravel', $class_vars['publicDefaultVar']);
} class ChildClass extends ParentClass
{
private $privateNoDefaultVar;
private $privateDefaultVar = 'private_laravel';
protected $protectedNoDefaultVar;
protected $protectedDefaultVar = 'protected_laravel';
public $publicNoDefaultVar;
public $publicDefaultVar = 'public_laravel';
}

get_object_vars()

get_object_vars()只会读取对象的public属性组成一个数组,类似于get_class_vars(), get_class_methods(),且属性没有默认值就是null,Laravel中只有一处使用到\Illuminate\Mail\Jobs\HandleQueuedMessage::__sleep() :line 78,写个PHPUnit测试下,爆绿灯:

    public function testGetObjectVars()
{
// Arrange
$get_object_vars = new TestGetObjectVars(1, 2, 3); // Actual
$object_vars = get_object_vars($get_object_vars); // Assert
$this->assertArrayNotHasKey('x', $object_vars);
$this->assertArrayNotHasKey('y', $object_vars);
$this->assertEquals(3, $object_vars['z']);
$this->assertArrayNotHasKey('dot1', $object_vars);
$this->assertArrayNotHasKey('dot2', $object_vars);
$this->assertArrayNotHasKey('circle1', $object_vars);
$this->assertArrayNotHasKey('circle2', $object_vars);
$this->assertEquals(10, $object_vars['line1']);
$this->assertEmpty($object_vars['line2']);
} class TestGetObjectVars
{
private $x;
protected $y;
public $z;
private $dot1 = 10;
private $dot2;
protected $circle1 = 20;
protected $circle2;
public $line1 = 10;
public $line2; public function __construct($x, $y, $z)
{ $this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

is_subclass_of()

is_subclass_of()用来判断给定类对象是否是另一给定类名的子类,Laravel中有用到,这里写下PHPUnit测试,爆绿灯:

    public function testIsSubclassOf()
{
// Arrange
$child_class = new ChildClass(); // Actual
$is_subclass = is_subclass_of($child_class, ParentClass::class); // Assert
$this->assertTrue($is_subclass);
}

is_a()

is_a()用来判定给定类对象是否是另一给定类名的对象或是子类,和is_subclass_of()有点类似,只是is_a()还可以判定是不是该类的对象,is_a()类似于instanceof操作符,Laravel中还没用到这个方法,这里写个PHPUnit测试,爆绿灯:

    public function testIsA()
{
// Arrange
$child_class = new ChildClass(); // Actual
$is_object = is_a($child_class, ChildClass::class);
$is_subclass = is_a($child_class, ParentClass::class); // Assert
$this->assertTrue($is_object);
$this->assertTrue($is_subclass);
}

最后,给下整个PHPUnit的测试代码:

<?php

namespace MyRightCapital\Container\Tests;

class IntrospectionTest extends \PHPUnit_Framework_TestCase
{
public function testClassExists()
{
// Arrange // Actual
$class_exists = class_exists(TestClassExists::class);
// Assert
$this->assertTrue($class_exists);
} public function testInterfaceExists()
{
// Arrange // Actual
$interface_exists = interface_exists(TestInterfaceExists::class);
// Assert
$this->assertTrue($interface_exists);
} public function testMethodExists()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$object_method_exists1 = method_exists($test_class_exists, 'testPrivateMethodExists');
$object_method_exists2 = method_exists($test_class_exists, 'testProtectedMethodExists');
$object_method_exists3 = method_exists($test_class_exists, 'testPublicMethodExists');
$classname_method_exists1 = method_exists(TestClassExists::class, 'testPrivateMethodExists');
$classname_method_exists2 = method_exists(TestClassExists::class, 'testProtectedMethodExists');
$classname_method_exists3 = method_exists(TestClassExists::class, 'testPublicMethodExists'); // Assert
$this->assertTrue($object_method_exists1);
$this->assertTrue($object_method_exists2);
$this->assertTrue($object_method_exists3);
$this->assertTrue($classname_method_exists1);
$this->assertTrue($classname_method_exists2);
$this->assertTrue($classname_method_exists3);
} public function testPropertyExists()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$private_property1 = property_exists($test_class_exists, 'testPrivatePropertyExists');
$private_property2 = property_exists(TestClassExists::class, 'testPrivatePropertyExists');
$protected_property1 = property_exists($test_class_exists, 'testProtectedPropertyExists');
$protected_property2 = property_exists(TestClassExists::class, 'testProtectedPropertyExists');
$public_property1 = property_exists($test_class_exists, 'testPublicPropertyExists');
$public_property2 = property_exists(TestClassExists::class, 'testPublicPropertyExists'); // Assert
$this->assertTrue($private_property1);
$this->assertTrue($private_property2);
$this->assertTrue($protected_property1);
$this->assertTrue($protected_property2);
$this->assertTrue($public_property1);
$this->assertTrue($public_property2);
} public function testTraitExists()
{
// Arrange // Actual
$test_trait_exists = trait_exists(TestTraitExists::class); // Assert
$this->assertTrue($test_trait_exists);
} public function testClassAlias()
{
// Arrange
class_alias(TestClassExists::class, 'MyRightCapital\Container\Tests\AliasTestClassExists');
$test_class_exists = new TestClassExists(); // Actual
$actual = new AliasTestClassExists(); //Assert
$this->assertInstanceOf(TestClassExists::class, $actual);
$this->assertInstanceOf(AliasTestClassExists::class, $test_class_exists);
} public function testGetClass()
{
// Arrange
$test_class_exists = new TestClassExists(); // Actual
$class_name = get_class($test_class_exists); // Assert
$this->assertSame(TestClassExists::class, $class_name);
} public function testGetParentClass()
{
// Arrange
$child_class = new ChildClass(); // Actual
$parent_class1 = get_parent_class($child_class);
$parent_class2 = get_parent_class(ChildClass::class); // Assert
$this->assertSame(ParentClass::class, $parent_class1);
$this->assertSame(ParentClass::class, $parent_class2);
} public function testGetCalledClass()
{
// Arrange
$child_class = new ChildClass();
$parent_class = new ParentClass(); // Actual
$child_called_class = $child_class->testGetCalledClass();
$parent_called_class = $parent_class->testGetCalledClass(); // Assert
$this->assertSame(ChildClass::class, $child_called_class);
$this->assertSame(ParentClass::class, $parent_called_class);
} public function testInArray()
{
$this->assertTrue(in_array('a', ['a', 'b', 1], true));
} public function testGetClassMethod()
{
// Arrange
$get_class_methods1 = get_class_methods(ChildClass::class);
$get_class_methods2 = get_class_methods(new ChildClass()); // Actual // Assert
$this->assertFalse(in_array('testPrivateGetClassMethod', $get_class_methods1, true));
$this->assertFalse(in_array('testPrivateGetClassMethod', $get_class_methods2, true));
$this->assertFalse(in_array('testProtectedGetClassMethod', $get_class_methods1, true));
$this->assertFalse(in_array('testProtectedGetClassMethod', $get_class_methods2, true));
$this->assertTrue(in_array('testPublicGetClassMethod', $get_class_methods1, true));
$this->assertTrue(in_array('testPublicGetClassMethod', $get_class_methods2, true));
$this->assertTrue(in_array('testGetCalledClass', $get_class_methods1, true));
$this->assertTrue(in_array('testGetCalledClass', $get_class_methods2, true));
} public function testGetClassVars()
{
// Arrange // Actual
$class_vars = get_class_vars(ChildClass::class); // Assert
$this->assertArrayNotHasKey('privateNoDefaultVar', $class_vars);
$this->assertArrayNotHasKey('privateDefaultVar', $class_vars);
$this->assertArrayNotHasKey('protectedNoDefaultVar', $class_vars);
$this->assertArrayNotHasKey('protectedDefaultVar', $class_vars);
$this->assertEmpty($class_vars['publicNoDefaultVar']);
$this->assertEquals('public_laravel', $class_vars['publicDefaultVar']);
} public function testGetObjectVars()
{
// Arrange
$get_object_vars = new TestGetObjectVars(1, 2, 3); // Actual
$object_vars = get_object_vars($get_object_vars); // Assert
$this->assertArrayNotHasKey('x', $object_vars);
$this->assertArrayNotHasKey('y', $object_vars);
$this->assertEquals(3, $object_vars['z']);
$this->assertArrayNotHasKey('dot1', $object_vars);
$this->assertArrayNotHasKey('dot2', $object_vars);
$this->assertArrayNotHasKey('circle1', $object_vars);
$this->assertArrayNotHasKey('circle2', $object_vars);
$this->assertEquals(10, $object_vars['line1']);
$this->assertEmpty($object_vars['line2']);
} public function testIsSubclassOf()
{
// Arrange
$child_class = new ChildClass(); // Actual
$is_subclass = is_subclass_of($child_class, ParentClass::class); // Assert
$this->assertTrue($is_subclass);
} public function testIsA()
{
// Arrange
$child_class = new ChildClass(); // Actual
$is_object = is_a($child_class, ChildClass::class);
$is_subclass = is_a($child_class, ParentClass::class); // Assert
$this->assertTrue($is_object);
$this->assertTrue($is_subclass);
}
} class TestGetObjectVars
{
private $x;
protected $y;
public $z;
private $dot1 = 10;
private $dot2;
protected $circle1 = 20;
protected $circle2;
public $line1 = 10;
public $line2; public function __construct($x, $y, $z)
{ $this->x = $x;
$this->y = $y;
$this->z = $z;
}
} class ChildClass extends ParentClass
{
private $privateNoDefaultVar;
private $privateDefaultVar = 'private_laravel';
protected $protectedNoDefaultVar;
protected $protectedDefaultVar = 'protected_laravel';
public $publicNoDefaultVar;
public $publicDefaultVar = 'public_laravel'; private function testPrivateGetClassMethod()
{
} protected function testProtectedGetClassMethod()
{
} public function testPublicGetClassMethod()
{
}
} class ParentClass
{
public function testGetCalledClass()
{
return get_called_class();
}
} class TestClassExists
{
private $testPrivatePropertyExists;
protected $testProtectedPropertyExists;
public $testPublicPropertyExists; private function testPrivateMethodExists()
{
} protected function testProtectedMethodExists()
{
} public function testPublicMethodExists()
{
}
} interface TestInterfaceExists
{ } trait TestTraitExists
{ }

PHP不仅提供了检测class, interface, trait, property, method这些函数Introspection Functions,还提供了一整套的API即反射来检测class, interface, trait, property, method,这些API是好几个类组成的,提供了很多好用的方法。限于篇幅,下篇再聊下反射API。

总结:本文主要聊了下PHP提供的一套检测class, interface, trait, property, method的两个工具包:Introspection Functions和Reflection API,这里先聊到Introspection Functions。下篇再聊下Reflection API的使用,到时见。

欢迎关注Laravel-China

Laravel学习笔记之PHP反射(Reflection) (上)的更多相关文章

  1. Laravel学习笔记(三)--在CentOS上配置Laravel

    在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚.     今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下.     1)系统 ...

  2. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  3. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  4. Dynamic CRM 2013学习笔记(十三)附件上传 / 上传附件

    上传附件可能是CRM里比较常用的一个需求了,本文将介绍如何在CRM里实现附件的上传.显示及下载.包括以下几个步骤: 附件上传的web页面 附件显示及下载的附件实体 调用上传web页面的JS文件 实体上 ...

  5. ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

    有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...

  6. Dynamic CRM 2015学习笔记(1)Azure 上安装 CRM 2015

    今天终于在Azure上安装成功了CRM 2015,下面简单介绍下安装过程,以及出现问题的解决: 一. 配置AD, 安装IIS 参考下面的link,里面有详细的配置步骤 http://www.c-sha ...

  7. Laravel 学习笔记之文件上传

    自定义添加磁盘——upload 位置:config/filesystems.php 'disks' => [ 'local' => [ 'driver' => 'local', 'r ...

  8. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

  9. Laravel 学习笔记 —— 神奇的服务容器 [转]

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

随机推荐

  1. Photon Server初识(四) --- 部署自己的服务Photon Server

    准备工作: 1.一台 window 虚拟机(本机是window也行) 2.下载SDK : https://www.photonengine.com/zh-CN/sdks#server 一:SDK介绍 ...

  2. 【AC自动机】玄武密码

    [题目链接] https://loj.ac/problem/10058 [题意] 对于每一段文字,其前缀在母串上的最大匹配长度是多少呢 [参考别人的题解] https://www.luogu.org/ ...

  3. vue页面顺序规范

    // html模板<template>    <div>因联vue页面规范</div></template><script>   // 模块 ...

  4. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  5. git bash配置SSH远程连接阿里云ECS

    1.连接配置 1-1.添加安全组规则 1-2.使用GitHub的话本地都会有id_rsa.pub(公钥),id_rsa(私钥),一般保存在C盘用户目录下.ssh文件夹. 把公钥内容复制下来(ssh-r ...

  6. JS写斐波那契数列的几种方法

    斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...

  7. Django rest-framework框架-请求数据校验

    验证实例: class UserInfoSerializer(serializers.Serializer): title = serializer.CharField(error_messages= ...

  8. Qt之QTableWidget

    学习QTableWidget就要首先看看QTableView控件(控件也是有”家世“的!就像研究人一样一样的),因为QTableWidget继承于类QTableView. 两者主要区别是QTableV ...

  9. pthread 编程基础

    Linux系统下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.与vxworks上任务的概 ...

  10. react import 配置路径别名'@',简化import Component的方式

    摘要 在react中,大多数业务逻辑都组件化:极大的减轻了代码的冗余度,如果组件的层次比较深的话,组件的import就比较费劲,在import时使用“../../components/test”的方式 ...